[MySQL]處理字元編碼的一些心得
因為我在寫程式所用的到的 MySQL,同時有 3.x 版及 5.x 版要處理,所以對 MySQL 的字元編碼問題需要特別做研究,研究了一陣子之後,終於有了一些初步的心得,列出舊版及新版的 MySQL 做為比較:
MySQL 4.1 以後的版本
- 程式要指定與 MySQL 傳輸時的編碼,ex:
use NAMES 'utf8'
(不指定時為「latin1」)
- 定義字串欄位時,也需指定字元集,ex:
Title varchar(5) character set utf8 default NULL
(不指定時為「latin1」)
- char(n), varchar(n), tinytext()… 等字串型態的欄位,其容量的計算單位改為「字數」。
- MySQL 相關的字串函數也是以「字數」做處理。
- 建議使用 phpMyAdmin 2.9.2 以後的版本維護資料庫。
MySQL 4.0 以前的版本
- 程式不需特別指定與 MySQL 傳輸時的編碼,寫入資料庫是什麼就是什麼 (預設為「latin1」),例如,你寫入了 utf8 的字元,其結果就是「用 latin1 的格式儲存 utf8 的資料」。
- 定義的字串欄位也不需指定字元集 (預設為「latin1」)
- char(n), varchar(n), tinytext()… 等字串型態的欄位,其容量的計算單位一律為「位元組」。
- MySQL 相關的字串函數一樣是以「位元組」做處理。
- 建議使用 phpMyAdmin 2.5.7 以前的版本維護資料庫。
使用 MySQL 4.1 以後的資料庫,但沿用 MySQL 4.0 以前的處理模式
既然 MySQL 4.1 以後的版本,在不指定編碼格式的情況下,其預設的也是「latin1」,那我全部都不要指定,不就可以與 MySQL 4.0 以前的版本相容了嗎?!
其實這樣說也沒錯,只是你在字串的欄位及相關字串函數的處理上會比較不那麼「聰明」,例如: unicode 的字元都被以「位元組」的方式來處理 (畢竟原本 Unicode 的中文字至少從 3 個位元組起跳),並且新版的 phpMyAdmin 無法正確顯示你的資料庫內容。
不過,假如你的資料庫是 MySQL 4.1 以後的版本,但基於
- 我不用 Unicode 儲存資料。
- 我用 Unicode 儲存資料,但不在乎 MySQL 在字元的處理上,是被當成了位元組。
在不更動 server 的設定下,可以使用以下的做法讓新版的 phpMyAdmin 可以來管理 MySQL 資料庫:
編輯 phpMyAdmin 在 libraries 目錄下的 select_lang.lib.php,
- 搜尋:
'utf-8' => 'utf8',
改成:
'utf-8' => 'latin1',
(搜尋的字串應該位於 $GLOBALS['mysql_charset_map'] 或 $mysql_charset_map 陣列之中)
- 儲存即可。
參考網頁
- 網站製作學習誌: MySQL 中文編碼徹底研究
- 酷學園: MySQL超出欄位長度後仍能儲存
- MySQL 的「SET NAMES xxx」字元編碼問題分析
No comments yet.