在存储微信公众号文章时,插入数据库报了这个错误 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