Mysql
MySQL 5.1 到 5.5:所有 UTF-8 字元失去!
我決定升級我的 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
。這可以通過
- 將數據庫轉儲到一個 Latin1 文件,然後將該文件導入為 UTF-8: 修復 MySQL 字元編碼不匹配;要麼
- 在 MySQL 中,通過轉換
binary
忽略錯誤的編碼:UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;