一、問題描述
另外一個系統調用服務接口api:/xxx/create?aName=&time=&...,數據沒有保存成功提示SQL state [HY000]; error code [1366]; Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1; 相信大家看到這個錯誤碼大概就知道什么原因了。
而當在windows系統中去調用接口並使用相同的數據庫,數據竟保存成功了但是數據庫中查看數據aName值卻是亂碼。
為什么在不同的操作系統中,相同的操作截然不同的結果?
二、原因分析
1、查看服務接口api的編碼
通過UrlDecode對接口api解碼發現,接口使用方對接口api進行了GBK編碼。
2、MYSQL字符集
SHOW VARIABLES LIKE 'character%';
解決問題的方法就很明了了,將接口api進行UTF-8編碼就可以解決此問題。
我們知道Windows系統默認的編碼格式GBK,Linux系統默認的編碼格式UTF-8。
三、MYSQL字符集修改
UTF-8 ——支持幾乎所有字符
GB2312 ——是簡體中文的碼
GBK ——支持簡體中文及繁體中文中的任何一個。
MySQL對於字符集的指定可以細化到一個數據庫、一張表、一列(字段),應該用什么字符集。
在create語句中通過添加character set 參數指定相應的字符集,如果不指定,則會默認使用其上一個層級的字符集。
我們可以通過修改mysql的my.cnf文件中的字符集鍵值,
1、在[client]字段里加入default-character-set=utf8,如下:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
2、在[mysqld]字段里加入character-set-server=utf8,如下:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server=utf8
3、在[mysql]字段里加入default-character-set=utf8,如下:
[mysql]
no-auto-rehash
default-character-set=utf8
修改完成后,service mysql restart重啟mysql服務就生效。注意:[mysqld]字段與[mysql]字段是有區別的。
4、如果上面的都修改了還有亂碼,在connection連接上進行編碼修改
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
四、總結
1、對接口api制定詳細使用說明 aName進行UTF-8編碼,避免剛接觸的使用者調到坑中。
2、系統中涉及編碼 統一使用UTF-8。
由於本人經驗有限,文章中難免會有錯誤,請瀏覽文章的您指正或有不同的觀點共同探討!