- Vixual - http://www.vixual.net/blog -

[MySQL]處理字元編碼的一些心得

因為我在寫程式所用的到的 MySQL,同時有 3.x 版及 5.x 版要處理,所以對 MySQL 的字元編碼問題需要特別做研究,研究了一陣子之後,終於有了一些初步的心得,列出舊版及新版的 MySQL 做為比較:

MySQL 4.1 以後的版本

  1. 程式要指定與 MySQL 傳輸時的編碼,ex:
    use NAMES 'utf8'

    (不指定時為「latin1」)

  2. 定義字串欄位時,也需指定字元集,ex:
    Title varchar(5) character set utf8 default NULL

    (不指定時為「latin1」)

  3. char(n), varchar(n), tinytext()… 等字串型態的欄位,其容量的計算單位改為「字數」。
  4. MySQL 相關的字串函數也是以「字數」做處理。
  5. 建議使用 phpMyAdmin 2.9.2 以後的版本維護資料庫。

MySQL 4.0 以前的版本

  1. 程式不需特別指定與 MySQL 傳輸時的編碼,寫入資料庫是什麼就是什麼 (預設為「latin1」),例如,你寫入了 utf8 的字元,其結果就是「用 latin1 的格式儲存 utf8 的資料」
  2. 定義的字串欄位也不需指定字元集 (預設為「latin1」)
  3. char(n), varchar(n), tinytext()… 等字串型態的欄位,其容量的計算單位一律為「位元組」。
  4. MySQL 相關的字串函數一樣是以「位元組」做處理。
  5. 建議使用 phpMyAdmin 2.5.7 以前的版本維護資料庫。

使用 MySQL 4.1 以後的資料庫,但沿用 MySQL 4.0 以前的處理模式

既然 MySQL 4.1 以後的版本,在不指定編碼格式的情況下,其預設的也是「latin1」,那我全部都不要指定,不就可以與 MySQL 4.0 以前的版本相容了嗎?!

其實這樣說也沒錯,只是你在字串的欄位及相關字串函數的處理上會比較不那麼「聰明」,例如: unicode 的字元都被以「位元組」的方式來處理 (畢竟原本 Unicode 的中文字至少從 3 個位元組起跳),並且新版的 phpMyAdmin 無法正確顯示你的資料庫內容。

不過,假如你的資料庫是 MySQL 4.1 以後的版本,但基於

  1. 我不用 Unicode 儲存資料。
  2. 我用 Unicode 儲存資料,但不在乎 MySQL 在字元的處理上,是被當成了位元組。

在不更動 server 的設定下,可以使用以下的做法讓新版的 phpMyAdmin 可以來管理 MySQL 資料庫:

編輯 phpMyAdmin 在 libraries 目錄下的 select_lang.lib.php

  1. 搜尋:
    'utf-8'        => 'utf8',

    改成:

    'utf-8'        => 'latin1',

    (搜尋的字串應該位於 $GLOBALS['mysql_charset_map']$mysql_charset_map 陣列之中)

  2. 儲存即可。

參考網頁

  1. 網站製作學習誌: MySQL 中文編碼徹底研究
  2. 酷學園: MySQL超出欄位長度後仍能儲存
  3. MySQL 的「SET NAMES xxx」字元編碼問題分析