MySQL中文insert報錯Incorrectstringvalue:'\xCC\xEC\xB2\xC5'
序言:中文錄入失敗,報錯:Incorrect string value: '\xCC\xEC\xB2\xC5',如下所示:
1,去查看數據庫的字符集,是utf8,顯示正常的。
mysql> show variables like '%char%';
2,去查看連接客戶端的字符集,
vim /etc/my.cnf
3,通過sqlyog遠程工具操作,在Query窗口執行如下命令:
SET NAMES utf8;
在sqlyog窗口查詢t表,也正常顯示中文字符,如下圖所示:
那麼以此推斷,問題在哪裡呢,客戶端sqlyog能正常錄入中文顯示中文,而linux的mysql窗口不行,得去檢查os層的linux操作系統的字符集設置。
4,檢查mysql服務器所在的linux os的字符集
[root@data01 ~]# cat /etc/sysconfig/i18n
然後重啟linux,重啟mysql,或者export LANG="zh_CN.UTF-8";
[root@data01 ~]# service mysqld5612 restart
5,測試,為了數據統一,linux重新設置字符集,然後重新登錄執行中文錄入操作,所以表drop後create,還是報錯,錄入不了中文進去,編碼問題
mysql> INSERT INTO t SELECT 4 AS a ,'第四夢' AS b;
6,檢查xshell工具連接,在Terminal->Encoding:後面的下拉框裡面,發現是默認的,沒有設置成utf8編碼,如下圖所示:
然後修改成utf8,如下所示:
然後再去執行,就可以錄入中文了,如下所示:
mysql> INSERT INTO t SELECT 4 AS a ,'第四夢' AS b;
7,番外篇set names utf8;無效的原因
PS:總結,因為mysql有服務端編碼和客戶端編碼概念之分,我的服務器端已經是utf8編碼,而我的MYSQL客戶端(不是mysql窗口界面而是遠程連接mysql服務器的客戶端工具xshell),明顯是GBK或ansi環境,所以必須設置成utf8才能轉換成功。
所以對於中文亂碼,需要去check的地方有如下3個:
1、mysql窗口的字符編碼(xshell連接的遠程工具的字符集設置);
2、數據庫的字符編碼(show variables like '%char%');
3、linux操作系統的字符編碼(echo $LANG);