Java emoji Incorrect string value

某天项目上线后不久,客服找到了我,说有用户发表评论一直发布不成功,上到服务器后看到以下的日志:

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呢?

  1. 用select version();来检查mysql数据库的版本,只有5.5.3以后的mysql才支持utf8mb4字符集.
  2. 用show create table tableName 来查看表的字符集(CHARACTER),然后用
    ALTER TABLE tableName DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    来设置.
  3. 还是用show create table tableName 来查看字段的字符集(CHARACTER),然后用
    ALTER TABLE tableName CHANGE columnName VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    来设置字段的字符集
  4. 查看jdbc链接,去掉&characterEncoding=utf8,看看有没有效果
  5. 查看 mysql-connector-java 这个包的版本,需要升级到5.1.13
  6. 查看 数据源(cp30或dbcp)是否加了
    <property name="connectionInitSql" value="set names utf8mb4;" />

一般都会解决问题`

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

相关阅读更多精彩内容

友情链接更多精彩内容