線上問題 - MySQL SQL state [HY000]; error code [1366]


一、問題描述                                                                                           

   另外一個系統調用服務接口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。

 

由於本人經驗有限,文章中難免會有錯誤,請瀏覽文章的您指正或有不同的觀點共同探討!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM