2012年3月11日 星期日

MySQL中文亂碼問題

我原先是用mysql-installer-5.5.21.0.msi
使用上沒有問題

不過要自己將my-small.ini複製一份,並將檔名改成my.ini,才可開始用client端連線

另外要匯入的資料格式須改為UTF8(無BOM)

後來用mysql-5.1.44-win32.msi
雖安裝過程有設定語系為UTF8
但使用中文還是會出現亂碼



參考了網路上的文章:
再谈乱码问题,如何解决MYSQL数据中文乱码问题
http://www.busfly.cn/post/58.html

又一次成功解决Mysql乱码问题
http://www.busfly.cn/post/mysql-utf8.html

於是我下兩道指令,比較5.5與5.1的差異
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

/* mysql-installer-5.5.21.0.msi */
/* 正常 */
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+------------------------------------
| Variable_name            | Value                             
+--------------------------+------------------------------------
| character_set_client     | big5                             
| character_set_connection | big5                                 
| character_set_database   | utf8                              
| character_set_filesystem | binary                            
| character_set_results    | big5                              
| character_set_server     | utf8                              
| character_set_system     | utf8                              
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\
+--------------------------+---------
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | big5_chinese_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

/* mysql-5.1.44-win32.msi */
/* 中文異常 */
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+------------------------
| Variable_name            | Value                 
+--------------------------+-------------------------
| character_set_client     | utf8                   
| character_set_connection | utf8               
| character_set_database   | utf8       
| character_set_filesystem | binary           
| character_set_results    | utf8              
| character_set_server     | utf8            
| character_set_system     | utf8          
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\
+--------------------------+---------
8 rows in set (0.00 sec)

/* 5.1 與 5.5 相異處 */
| character_set_client     | big5
| character_set_connection | big5
| character_set_results    | big5
| collation_connection | big5_chinese_ci

於是我在5.1下:
SET CHARACTER_SET_CLIENT=big5;
SET CHARACTER_SET_CONNECTION=big5;
SET CHARACTER_SET_RESULTS=big5;
SET collation_connection=big5_chinese_ci;

參考了以下文章:
[轉載]MySQL 的 "SET NAMES xxx" 字元編碼問題分析
http://www.vixual.net/blog/archives/310

以上四句指令效果等同於:
SET NAMES big5;

為什麼原本UTF-8會異常,要部份改BIG5才會正常?
我想問題是出在我client端的軟體用的是Windows的DOS
DOS是ANSI或BIG5,她似乎不支援UTF-8

資料輸入路徑:client → connection → server
資料輸出路徑:server → connection → results

connectio是代表什麼?

以上步驟解決了中文亂碼的問題,但每次連線都要再重新SET
而且還有一個問題
就是輸出的表格若是有中文,會多許多空格或空白鍵,導致表格的格線對不齊



於是我又再試另一種方法:
【保証成功】的 mysql 中文亂碼解決方案
http://ria.richtechmedia.com/2005/12/19/%E3%80%90%E4%BF%9D%E8%A8%BC%E6%88%90%E5%8A%9F%E3%80%91%E7%9A%84-mysql-%E4%B8%AD%E6%96%87%E4%BA%82%E7%A2%BC%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%A1%88/

在my.ini加上
[mysqld]
default-character-set=utf8

[client]
default-character-set=big5
// init_connect='SET NAMES utf8' // 好像可不加

去掉
[mysql] //我不知道這是做啥的
default-character-set=utf8

接著重新連線
然後中文對齊的問題就解決了,也不用每次再重新SET

mysql 4.1中文亂碼第二擊
http://ria.richtechmedia.com/2005/08/14/mysql-41%e4%b8%ad%e6%96%87%e4%ba%82%e7%a2%bc%e7%ac%ac%e4%ba%8c%e6%93%8a/
首先,要讓mysql 4.1正確顯示中文最簡單的方法就是全程使用 utf8,從網頁到連線到資料庫等,而my.ini的設定如下:

[mysqld]
default-character-set=utf8

#settings for clients (connection, results, clients)
[mysql]
default-character-set=utf8

其中 [mysqld] 是設定 mysql啟動時要採用的語系,而[mysql]則是通知外來的連線client(例如php頁面或 flash 程式)要使用何種語系設定。

沒有留言:

張貼留言