標籤:mysql字元集 亂碼
前段時間在跨版本遷移MySQL資料的時候總是越到亂碼問題,現總結一下。
思想:資料亂碼其實就是資料在寫入時和讀出時使用了不同的字元編碼規則,解決亂碼也就是統一字元編碼規則,也叫統一字元集。比如資料庫表使用ascii編碼儲存資料,而在插入或讀取資料時使用gb2312一定會出亂碼。
在MySQL中字元集是多層繼承的,MySQL預設字元集——>資料庫字元集——>表字元集。在建立資料中若未指定資料庫字元集,則建立的庫繼承MySQL預設字元集,同樣,若建立表未指定字元集則繼承所屬的資料庫字元集。在新搭建一台MySQL服務時一定要提前設定好預設字集,MySQL預設為latin1,為了相容多國語言推薦使用utf8。
MySQL預設字元集指定方法:
修改my.cnf設定檔:
[mysqld]
default-character-set=utf8 #適用於5.1及以前版本
character-set-server=utf8#適用於5.5版本
檢查當前字元集設定:
SHOW VARIABLES LIKE ‘character%‘; #執行此命令可查詢當前環境中關於字元集的設定,如下:
character_set_client: 用戶端。由設定檔中的default-character-set指定,若不指定則會讀取當前shell終端的字元集,並保持與之保持一直。
character_set_connection:當前串連。當用戶端和伺服器字元集不同時以此串連為準。由設定檔中的default-character-set指定,若不指定則會讀取當前shell終端的字元集,並保持與之保持一直。
character_set_database: 資料庫字元集。由設定檔指定或建庫建表時指定。由伺服器端參數character_set_server指定
character_set_filesystem: 字元集檔案系統
character_set_results: 返回結果。由設定檔中的default-character-set指定,若不指定則會讀取當前shell終端的字元集,並保持與之保持一直。
character_set_server: 伺服器字元集,設定檔指定或建庫建表指定。由伺服器端參數character_set_server指定
預設情況下character_set_client、character_set_connection和character_set_results與系統的字元集一致(/etc/sysconfig/i18n)。
查詢資料時亂碼:
1、在查詢資料時亂碼時首先要先查詢出當前資料庫乃至表的當前字元編碼,命令如下:
SHOW CREATE DATABASE DatabaseName; #查詢資料庫編碼規則
SHOW CREATE TABLE DatabaseName.TableName; #查詢表的編碼規則
2、根據庫或表的編碼所用字元集修改SELECT查詢時反饋資料的編碼字元集:
SET NAMES CharacterSet; #設定NAMES值,此命令會同時修改character_set_client、character_set_connection和character_set_results。此設定臨時生效。
或修改my.cnf設定檔:
[client]
default-character-set=CharacterSet #設定檔中修改永久生效
插入資料後亂碼:
在拷入資料時同查詢時一樣,首先要保證寫入資料時的編碼同表的編碼規則一致。可通過修改NAMES實現。或使用指令碼匯入時指定編碼,以gb2312為例:
SET NAMES gb2312; 或:
mysql --default-character-set=gb2312 DatabaseName < DatabaseName.sql
遷移資料:
若要從一個MySQL伺服器中將資料移轉至另一台MySQL伺服器,可通過mysqldump匯出資料,將資料拷貝至新伺服器後再匯入。
1、在匯出資料前一定要查看預匯出資料庫表的編碼規則:
SHOW CREATE TABLE DatabaseName.TableName;
2、依據該規則指定字元集匯出:
mysqldump -hHostIP -uUsername -p --default-character-set=CharacterSet DatabaseName > DatabaseName.sql
3、資料拷貝至新伺服器後,在匯入時指定新資料庫表的字元集:
mysql --default-character-set=NewCharacterSet DatabaseName < DatabaseName.sql
注意:
1)在新MySQL伺服器中匯入資料前要注意檢查DatabaseName.sql指令檔中指定的儲存引擎和字元集是否與新伺服器一致,若不一致可使用sed命令修改;
2)mysqldump匯出的指令檔中沒有建立資料庫,需要提前手工建立資料庫,並在匯入時指定該資料庫;
本文出自 “銀凱的部落格” 部落格,請務必保留此出處http://yinkai.blog.51cto.com/3813923/1735820
關於MySQL亂碼問題總結