前世今生Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x86\xE4\

在存储微信公众号文章时,插入数据库报了这个错误 Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x86\xE4\

解决方案:

因为只是存储文章的字段出现了错误,所以对文章字段进行编码修改,当然你也可以对整个表进行编码修改,也可以对整个数据库进行修改设置。

ALTER TABLE pss_circle_article MODIFY content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

原因分析:

第一步 我们先看看\xF0\x9F\x91\x86\xE4\ 是啥 ?

首先emoji就是表情符号,属于表意文字,占用4个字节,所以只要取前4个字节就行,通过转换就知道了,原来是这个。


第二步 我们看下utf8mb4是啥?

MySQL支持多种Unicode字符集:

utf8mb4:Unicode字符集的UTF-8编码,每个字符使用1-4个字节。

utf8mb3:Unicode字符集的UTF-8编码,每个字符使用一到三个字节。

utf8:的别名 utf8mb3。

ucs2:Unicode字符集的UCS-2编码,每个字符使用两个字节。

utf16:Unicode字符集的UTF-16编码,每个字符使用两个或四个字节。像,ucs2但扩展了辅助字符。

utf16le:Unicode字符集的UTF-16LE编码。就像utf16小端而不是大端。

utf32:Unicode字符集的UTF-32编码,每个字符使用四个字节。

utf8mb4,utf16, utf16le,和utf32支持基本多语种平面(BMP)字符和补充字符谎言BMP外部。utf8并且 ucs2仅支持BMP字符。

可见utf8无法存放emoji,所以需要utf8mb4。



第三步  我们看下utf8mb4_unicode_ci是啥?

实际上这是指定了utf8mb4的排序方式,还有一种是general_ci,general_ci排序速度较unicode_ci快,但正确性稍差,实际上如果我们只是用来存储,不进行排序,用哪种都是可以的。而且当设置为utf8mb4,mysql默认采用的是general_ci排序

可以使用命令查看

SHOW CHARACTER SET;


参考资料:

https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-sets.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容