Navicat和MYSQL字符集不統一出現的中文亂碼問題
最近遇到一串關於MYSQL中文亂碼的問題,問題背景是這樣的:
在此之前,伺服器上安裝好MySQL之後就立馬重新配置了字符集為utf8,之後用Navicat進行資料匯入,發現中文的字元匯入之後全是亂碼,然後查論壇很
快通過以下方式解決了:建立連線時編碼選擇UTF-8,把使用MYSQL字符集之前的勾勾去掉。
資料庫的屬性設定為:
OK,Navicat裡的中文字元正常了。於是 ,開心的進行資料匯入,一切感覺完美~
接下來我在命令列採用最簡單的mysqldump方法進行備份,備份成功,因為都是測試資料,我順手開啟備份好的檔案一看,又是亂碼!之後命令列直接進到資料庫查詢,
果然查詢結果也是亂碼!我用命令列建了一個測試表,插入中文資料,查表,顯示正確;Navicat查表,亂碼。這是什麼情況~明明兩邊都是UTF-8
編碼方式。
內心一萬隻羊駝奔過...
OK 我們現在來一步步排查問題:
首先,開啟/etc/my.cnf 檔案檢視是否字符集配置正確,果然,在[mysqld] 下錯寫成了default-character-set=utf8
正確的配置方式:
先備份一下my.cnf檔案,然後 vim /etc/my.cnf 插入以下幾行
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8 #注意這行不要寫成 default-character-set=utf8
[mysql]
no-auto-rehash
儲存之後service mysqld restart 啟動成功 ,進行之前的資料測試,亂碼問題依然存在。能兩邊的字符集真的不一樣呢?
查了一些資料才知道:只要涉及到文字的地方,就會存在字符集和編碼方式。對於MySQL資料庫系統而言,使用者從MySQL client端敲入一條sql語句,通過TCP/IP傳遞給
MySQL server程序,到最終存入server端的檔案,每個環節都涉及到字元儲存。涉及到字元儲存的地方,就涉及到字符集編碼。
我們就用 show variables like'char%';和 showvariables like 'collation_%';來檢視一下:
分別在MYSQL、Navicat中執行命令;
兩邊有些字符集和校對的系統變數是不同的。
至此,我找到了問題的關鍵。
最後我們去解決問題,我有兩種方法:
①我們以MySQL配置為準。在Navicat 中執行以下命令:
setcharacter_set_client= utf8;
setcharacter_set_connection =utf8 ;
setcharacter_set_results=utf8 ;
再檢視字符集,兩邊就一致了。進行測試,亂碼問題解決。