java mysql utf8编码问题Incorrect string value:

最近遇到mysql数据存储时报错

uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x98\x81",...' for column 'request_data' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x81",...' for column 'request_data' at row 1

创建数据库和表时采用的字符集编码为utf8, 存储emoji表情时会产生以上错误。
需要将utf8变为utf8mb4。关于两者编码的区别,参见utf8和utf8mb4区别mysql uft8mb4与emoji表情

网上的解决办法大多是修改my.cnf参数,设置mysql的编码为utf8mb4,这种方法虽然彻底,但是通常要重启mysql,会造成生产系统临时当机。
下面是影响相对更小的处理方法:

前提:mysql的版本不能太低,低于5.5.3的版本不支持utf8mb4编码。

将表中的对应字段,比如会员表的呢称字段,其字符集修改成utf8mb4。

然后在java客户端,将mysql-connector-java升级成最新版(目前最新版是5.1.37),最后修改druid数据源的配置,增加一行:
<property name="connectionInitSqls" value="set names utf8mb4;"/>
基本上应该就可以了,如果还不行,检查下jdbc连接串的设置:

jdbc:mysql://localhost:3306/db名称?useUnicode=true&characterEncoding=utf8

再不行的话,把最后的?useUnicode=true&characterEncoding=utf8 去掉

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容