Posted on August 9, 2005 in Open Source by pestNo Comments »

æœ€è¿‘æ›æˆä½¿ç”¨ 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,請ä¸è¦å•我該怎麼加入這段程å¼ç¢¼ã€‚請尋求你所使用的軟體之開發者的å”助。