æœ€è¿‘æ›æˆä½¿ç”¨ MySQL 4.1 的人越來越多了,在許多地方也看到了哀嚎è²å››èµ·ï¼Œé‡åˆ°çš„ç‹€æ³ä¸å¤–乎是原本的資料çªç„¶éƒ½è®Šæˆä¸æ£å¸¸äº†ï¼Œæ‰€ä»¥åœ¨é€™é‚Šæä¾›æ£è§£ã€‚
事實上這個å•題ä¸å…‰æ˜¯ä½¿ç”¨ UTF8 會有,照ç†èªªä½¿ç”¨å…¶ä»–語系也會有相åŒçš„å•題,例如如果我們原本用 GB2312 來å˜è³‡æ–™ï¼Œçµæžœç¾åœ¨å‡ç´šå¾Œæ‡‰è©²ä¹Ÿæœƒæœ‰å•題。解決之é“也很簡單:資料庫是什麼編碼,之後 Client 端程å¼å°±ç”¨ä»€éº¼ç·¨ç¢¼å’Œå®ƒæºé€šã€‚
é‚£è¦æ€Žéº¼çŸ¥é“資料庫原本是什麼編碼呢?我在 commit 給 plog ä¸ adodb çš„ patch ä¸åŒ…å«äº†ä¸€æ®µæª¢æŸ¥ database encoding çš„ code:
function _getDbDefaultEncoding($argDatabasename){
if (!$argDatabasename) {
return false;
}
// We use a SHOW CREATE DATABASE command to
// show the original SQL character set when DB was
// created.
$result = mysql_query("SHOW CREATE DATABASE
$argDatabasename", $this->_connectionID);
if (mysql_num_rows($result) < 0 ) {
// The specified db name is wrong!
return false;
}
$dbInfo = mysql_fetch_row($result);
$pattern = '/40100 DEFAULT CHARACTER SET (w+) /';
if ( (preg_match($pattern, $dbInfo[1], $match) > 0) ) {
return $match[1];
}
return false;
}
這個函弿œƒæª¢æŸ¥ç•¶åˆè³‡æ–™åº«å»ºç«‹çš„編碼方å¼ï¼Œä¸¦å›žå‚³å›žä¾†ï¼Œé€™æ¨£å¯ä»¥ç¢ºä¿æˆ‘們䏿˜¯å†’然把 MySQL client çš„ encoding è¨å®šæˆ UTF-8 (這是目å‰çœ‹åˆ°å¤§å¤šæ•¸äººçš„解法)。
接下來,在 SelectDB() 函å¼ä¸ï¼Œåšä»¥ä¸‹ä¿®æ”¹:
function SelectDB($dbName)
{
$this->databaseName = $dbName;
if ($this->_connectionID) {
+ $dbEncoding =
+ $this->_getDbDefaultEncoding($dbName);
+ if ($dbEncoding) {
+ mysql_query("SET NAMES $dbEncoding",
+ $this->_connectionID);
+ }
return @mysql_select_db($dbName, $this->_connectionID);
}
else return false;
這樣應該ä¸ç®¡åŽŸæœ¬çš„ç·¨ç¢¼ç‚ºä½•ï¼Œè®€å’Œå¯«éƒ½ä¸æœƒæœ‰å•é¡Œï¼›å”¯ä¸€è¦æ³¨æ„çš„æ˜¯ï¼Œå¦‚æžœä½ çš„ MySQL 䏿˜¯ 4.1 ä»¥ä¸Šï¼Œæœ‰äº›æŒ‡ä»¤ä¸¦ä¸æ”¯æ´ï¼Œæ‰€ä»¥é€™æ®µ patch ä¸é©ç”¨ï¼›æˆ‘也替 pLog 寫了一個 isSupportUtf8() çš„ function call, å¯ä»¥ç”¨ä¾†æª¢æŸ¥æ˜¯å¦æ˜¯ 4.1 以上的版本,ä¸éŽå°±ä¸å†é€™é‚Šå¤šåŠ è´…è¿°äº†ã€‚
P.S. 請注æ„ï¼Œå¦‚æžœä½ æ²’æœ‰å¸éŽ PHP,請ä¸è¦å•æˆ‘è©²æ€Žéº¼åŠ å…¥é€™æ®µç¨‹å¼ç¢¼ã€‚è«‹å°‹æ±‚ä½ æ‰€ä½¿ç”¨çš„è»Ÿé«”ä¹‹é–‹ç™¼è€…çš„å”助。