mysql亂碼現象及對字符集的理解

lusklusklusk發表於2017-03-29
資料庫版本是5.7.17

現象1
Navicat Premium導sqlserver資料到mysql時,發現一些表只導了表結構沒有匯入資料,一些表匯入了部分資料,一些表資料全部匯入成功

查詢原因:
1.發現匯入成功的資料都是沒有任何中文的
2.在mysql上刪除只導了表結構沒有匯入資料的表A,使用Navicat Premium重新表A,檢視Navicat Premium匯入日誌[Err] [Row1] [Imp] 1366 - Incorrect string value: '\xE6\xAD\xA3\xE5\xB8\xB8...' for column 'colunmname1' at row 1
3.在sqlserver上檢視select colunmname1 from A發現都是中文內容
至此查出原因:就是因為簡體中文的原因,導致沒有匯入成功

解決方法
方法1:在mysql上查詢表A的建表語句show create table A,發現建表語句最後是CHARSET=latin1,重新修改表A的建表語句把CHARSET=latin1改成CHARSET=utf8,再刪除表A,再重新建立表A,再導表就OK了


方法2:mysql -uroot -p123456
mysql>show variables like 'char%';發現庫裡面的字符集character_set_database是latin1
修改/etc/my.cnf新增如下配置
[mysqld]下新增character-set-server=utf8
[mysql]下新增default-character-set=utf8
[client]下新增default-character-set=utf8
service mysqld restart
再在mysql上drop匯入沒有完全成功的表,再重新導表(當然在個人實驗中,匯入還是繼續報錯的,因為mysql -uroot -p123456進去後沒有選擇庫,修改後只是新增庫的字符集會變成utf8,當然選擇了庫也沒用,雖然重啟了資料庫,但表A對應的庫如DATABASEA是修改配置之前建立的,它的字符集還是latin1,除非重建DATABASEA把字符集修改為utf8,這樣風險太高,裡面的東西都得重新弄過一次)



現象2
mysql字符集都是utf8了,但是在個人的windows機器上使用SQLyogEnt查詢表A,發現中文亂碼,加上語句後SET character_set_results=gbk後才不亂碼
而在個人的windows機器上使用putty登入mysql伺服器使用mysql>查詢發現表A不亂碼

原因:
個人電腦cmd輸入chcp值是936對應簡體中文
mysql伺服器echo $LANG顯示是zh_CN.UTF-8

在windows上透過工具SQLyogEnt連線mysql查詢,其實是在windows上查詢,使用的是windows的字符集gbk,但是mysql字符集是utf8,所以會亂碼
在windows上透過putty連線mysql伺服器查詢,其實就是在mysql伺服器端查詢,mysql伺服器字符集UTF-8,mysql字符集是utf8,所以不會亂碼



理解
1.mysql安裝後資料庫字符集預設是latin1

2.my.cnf修改字符集配置並重啟後,只是對新增的庫生效,老庫還是latin1,老庫新增表也還是隨老庫latin1
3.庫和表的字符集可以不一樣,遇到問題評估下是重導表還是重導庫

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2136291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章