Mysql

MySQL 5.1 到 5.5:所有 UTF-8 字元失去!

  • September 30, 2012

我決定升級我的 Debian 安裝,在使用 MySQL 5.5 幾天后,我發現mysql在終端列印垃圾而不是 UTF-8 字元。

我查看了由 生成的 SQL 文件,mysqldump發現它已經包含了垃圾。今天,我刪除了數據庫並獲得了執行良好的舊數據庫的副本/var/lib/mysql/database_name/*,令我驚訝的是,我仍然得到相同的結果。

生成的文件mysqldump包括以下幾行:

/*!40101 SET NAMES utf8 */;
/*!40101 SET character_set_client = utf8 */;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

/var/lib/mysql/database_name/db.opt新舊數據庫是一樣的:

default-character-set=latin1
default-collation=latin1_swedish_ci

我現在能做什麼?我希望我不會失去整個數據庫!

更新

show session variables like 'character%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

SELECT charset(name), hex(name), name FROM table WHERE id='123';
+---------------+----------------------------------------------+----------------------------+
| charset(name) | hex(name)                                    | name                       |
+---------------+----------------------------------------------+----------------------------+
| latin1        | 457361C3BA204A6F73C3A92064652053616E74616E61 | Esaú José de Santana     |
+---------------+----------------------------------------------+----------------------------+

最後一個命令中 name 的輸出應該是Esaú José de Santana

來自@CL 的答案。在調試方面幫助了我很多,但反過來:數據庫和備份文件都使用 latin1 編碼,但客戶端需要 UTF-8 輸出。

解決方案是確保character_set_client也設置為 latin1:

[client]
default-character-set = latin1

MySQL 輸出和終端正常工作;問題是數據庫中的文本標記為latin1,但實際上編碼為utf8

這可以通過

  1. 將數據庫轉儲到一個 Latin1 文件,然後將該文件導入為 UTF-8: 修復 MySQL 字元編碼不匹配;要麼
  2. 在 MySQL 中,通過轉換binary忽略錯誤的編碼:
UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;

修復 MySQL 中的列編碼混亂

引用自:https://unix.stackexchange.com/questions/49520