關於ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x87\xA8\xF0\x9F...'報錯的解決心得


昨天發現MySQL數據庫執行發生了報錯

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x87\xA8\xF0\x9F...'

馬上意識到應該是字符編碼不匹配的問題。經核實,是某個名字中含有表情,是個4個字節的utf8字符,utf8是可變長度的,根據字符的不同有1個字節、2個字節、3個字節和4個字節四種情況。
MySQL的utf8只支持3個字節的,4個字節的需要用utf8mb4。
查看具體的字段,發現已經是utf8mb4字符集的了,那么到底是在哪個環節出了問題呢?根據搜索,網上的有讓mysql的my.ini配置的,有讓改表字符集、字段字符集的,都對不上,因為我的表和字段都設置成utf8mb4了。
感謝https://blog.csdn.net/geilivablemental/article/details/45034229帶來的靈感。
通過查詢

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

以上,我把character_set_client和character_set_connection設置為utf8mb4就可以了。
character_set_client和character_set_connection其中一個不為utf8mb4,都會導致表情符號變成亂碼,但是不會報錯,只有都是uft8mb4,才能完整支持。
經過一系列的嘗試,發現字符集的控制只與character_set_clientcharacter_set_connection這個字段的字符集類型有關系
與表、數據庫、數據庫服務器的字符集以及配置沒有關系(未細致排除是否受系統等非MySQL軟件的影響,在CentOS Linux release 7.8.2003上測試)
通過修改客戶端和鏈接的編碼類型、字段的字符集類型,保持最大兼容(utf8mb4兼容utf8,utf8兼容latin1),便解決了這個問題。
至於如何修改客戶端character_set_client和鏈接character_set_connection的編碼類型,取決於各個客戶端API,做法不一,一般創建鏈接的時候都可以指定encoding。


免責聲明!

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



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