后台日志显示数据库提交失败。查看日志如下:
java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1
经过分析,是因为用户在“最大的期望”栏输入了微信表情,由于MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常。
为了快速解决,当时处理方式是转译存储,取出来的时候,再进行解码。但是这样做会使得任何使用该字符的地方都要进行编码与解码。
utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。
方式:
1、MySQL的版本不能太低,低于5.5.3的版本不支持utf8mb4编码。selectversion(); 查看版本,目前我们是5.5.38
2、JDBC驱动版本不能太低,mysqlconnector版本高于5.1.13。便利店是:mysql-connector-java-5.1.33.jar
3、将表中的对应字段,比如申请入驻表的对京东便利店最大的期望字段,其字符集修改成utf8mb4。
ALTER TABLE xxx_apply MODIFY COLUMNremark VARCHAR(600)CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '最大的期望';
或者直接修改整张表
ALTER TABLE xxx_apply CONVERT TOCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4、最后修改dbcp数据源的配置,增加一行:<propertyname="connectionInitSqls" value="set names utf8mb4;"/>
5、检查下jdbc连接串的设置:jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8
characterEncoding=utf8会自动识别为utf8mb4