2016年5月26日 星期四

[Django, MySQL] MySQL 中文亂碼問題

為了廣大華人市場,製作中文網站勢在必行!不過卻經常遇到 MySQL 儲存中文資料遇到亂碼的問題,經過一番研究,在此紀錄完整的解決方案。

MySQL 遇到中文亂碼最主要的原因是 CHARACTER SET 不支援中文顯示!

解決這個問題的最佳方案為

設定 CHARACTER SET 為 UTF8,因為 UTF8 支援所有字符!

首先進到 MySQL,查看默認的編碼格式

mysql > show variables like "%char%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

我們可以發現,character_set_database 與 character_set_server 皆為 latin1 編碼。

透過下面指令,修改這兩個的預設編碼

mysql > set character_set_database = "utf8";
mysql > set character_set_server = "utf8";

修改後再次檢查編碼

mysql > show variables like "%char%";

+--------------------------+----------------------------+
| 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       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

全數編碼皆改為 UTF8。

到這裡如果已解決中文亂碼的問題,恭喜你!只不過,筆者如果重啟 Apache,會發現character_set_server 預設的編碼又變成 latin1。這時候只好從根本下手,修改 my.cnf 內的設定。

$ sudo vi /etc/mysql/my.cnf

1. 在 [client] 段落裡加入:

default-character-set=utf8

2. 在 [mysqld] 段落裡加入:

character-set-server=utf8
init-connect="SET NAMES utf8"
collation-server=utf8_unicode_ci

3. 在 [mysql] 段落裡加入:

default-character-set=utf8

存檔後重啟 MySQL: $ sudo service mysql restart

這樣就從根本解決 MySQL 中文顯示亂碼的問題囉~




當然,在建立 database 的時候別忘了將編碼設定為 UTF8 唷!XD

mysql > create database YOUR_DB default character set utf8;

沒有留言:

張貼留言