某天项目上线后不久,客服找到了我,说有用户发表评论一直发布不成功,上到服务器后看到以下的日志:
16:22:39,757 INFO []-SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [....]; Data truncation: Incorrect string value: '\xF0\x9F\x90\xB1' for column 'content' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x90\xB1' for column 'content' at row 1
这个日志以前也遇到过,是储存emoji表情不成功报的错.mysql的utf8字符集最多是3个字节,但是emoji表情却有4个字节,不够用,我们可以用支持4个字节的utf8mb4字符集来存储这些表情.
那么怎么设置utf8mb4呢?
- 用select version();来检查mysql数据库的版本,只有5.5.3以后的mysql才支持utf8mb4字符集.
- 用show create table tableName 来查看表的字符集(CHARACTER),然后用
ALTER TABLE tableName DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
来设置. - 还是用show create table tableName 来查看字段的字符集(CHARACTER),然后用
ALTER TABLE tableName CHANGE columnName VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
来设置字段的字符集 - 查看jdbc链接,去掉
&characterEncoding=utf8
,看看有没有效果 - 查看 mysql-connector-java 这个包的版本,需要升级到5.1.13
- 查看 数据源(cp30或dbcp)是否加了
<property name="connectionInitSql" value="set names utf8mb4;" />
一般都会解决问题`