close

mysql中文亂碼的原因

*mysql中文亂碼的原因
mysql 會出現中文亂碼的原因不外乎下列幾點:
→ mysql server本身設定問題,例如還停留在 latin1
→ mysql table 的語系設定問題(包含 character 與 collation)
→ 客戶端程式(例如 php) 的連線語系設定問題


mysql 4.1 及之後的版本在語系方面增加了許多功能,它可以設定語系的層次從最底層的 server, database 到單一 table, column, connection 都可以設定,而除了語系之外,還可以指定搭配不同的 collation(校對),所以組合百百種,只要一個錯了就難逃亂碼的命運。

進phpmyadmin找到可輸入 sql query的畫面,然後鍵入:
show variables like '%character%';
這句話會顯示目前資料庫使用的語系設定,一般國外的網站或剛裝好的 mysql 4.1預設都是 latin-1。

[新增資料庫]
如果你熟悉 phpmyadmin 的操作,在畫面上就可以選擇建立新 database 要用的語系,
charset 請選擇 UTF-8 Unicode (utf8)
collation 請選擇 utf8_general_ci (ci 代表 case insensitve 大小寫沒差)

[修改資料庫]
改 database語系,同樣在 phpmyadmin 的query畫面鍵入下面兩行:
alter database myblog
character set utf8;


前面曾經提過,mysql的語系設定是多層次的,前面我們把database與table的語系都設定正確,但程式與mysql連線時的語系則是由 connection 來決定,這部份就要使用程式碼
mysql_query("SET NAMES 'utf8'");
這句話會同時設定 client, results, connection三者使用的語系為 utf-8。

最後檢查是否全部改成 utf-8
show variables like '%character%';

此時你應該會看到大部份欄位都是utf-8了,除了 server 這項之外,如果是用別人的 hosting 主機,就沒法兒改這部份,但平常做案子時大部份都可以直接控管mysql,此時就可以用 my.ini 設定:

[mysqld]
default-character-set=utf8
告訴mysql server啟動時要用 utf-8即可。



*mysql中文亂碼必勝解決法
1、mysql 啟動時會讀取一個預設的 config 檔,一般名稱為 my.ini,而它會到下列兩位置去尋找這個檔案:
C:\windows\my.ini 也就是作業系統的安裝目錄,也有可能是 C:\winnt\my.ini
C:\:my.cnf 也就是 C disk 的根目錄


2、my.ini 裏的內容為:
[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8
init_c

其中 mysqld 是指定 server 啟動時要用的語系,但如果這裏設定為 utf8 可能會讓許多英文軟體不開心,例如 osCommerce/mediaWiki/wordpress/drupal/gregarius,所以這裏建議設成 latin1。要使用utf8中文的人,只要記得建資料庫時將它設成utf8,讓中文程式正確的使用 utf8 與它溝通即可。


下面的 client 則是設定當 client 連線時要使用什麼語系,但可惜的是這個設定不是每個 client 都會鳥它,基本上只有 mysql 自已家的程式,例如 mysql.exe, mysqld.exe, mysqladmin.exe 或是 MySQL Control Center 這種程式會去讀取這個設定檔然後改用 utf8 連線。

所以通常會用一個獨立的檔案來處理 mysql connection的設定,例如:

PHP:
[code]
<?
//database connection details.
$host = "localhost";
$link = mysql_connect($host, "xxx", "xxx");
mysql_query("SET NAMES 'utf8'");
mysql_select_db("your_table_name_here", $link);
?>
[/code]
請注意在 mysql_connect後第五行的地方有加上一個 "set names 'utf8' "的指令,告訴mysql 這個 connection 之後的連線內容都要使用utf8,經過這樣設定後,通常就可以解決大部份問題。

從這裏也可以推想得知,如果你有用某種 custom connection pooling 機制,就要記得在每次建立新的 connection 後立即設定為 utf8。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 avrilnote 的頭像
    avrilnote

    Avril Note

    avrilnote 發表在 痞客邦 留言(0) 人氣()