最近做项目需要用到emoji表情,好不容易把前端搞定,提交数据到后台发现无法插入数据库,异常提示如下:
org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8D\x85\xF0\x9F…’ for column ‘document’ at row 1 ### The error may exist in com/xxx/xxxx/dao/CreativeMapper.java (best guess) ### The error may involve com.xxx.xxx.dao.CreativeMapper.insert-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO tab_xxx ( id, document, description, user_id, like_num, comment_num, doc_status, read_num, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? ) ### Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8D\x85\xF0\x9F…’ for column ‘document’ at row 1 ; uncategorized SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: ‘\xF0\x9F\x8D\x85\xF0\x9F…’ for column ‘document’ at row 1; nested exception is java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8D\x85\xF0\x9F…’ for column ‘document’ at row 1
1 2 3 4 5 6 7 8 9 开发环境spring boot + druid + mybatisplus + mysql,这里贴一下数据库相关配置代码
/** 驱动包 */ <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency>
datasource: username: xxx password: xxxx url: jdbc:mysql://localhost:3306/xxx?characterEncoding=utf-8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false&serverTimezone=CTT driver‐class‐name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource druid: connection-init-sqls: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 上网查询了一下资料,锁定mysql编码格式问题,解决问题后总结如下: 1、mysql版本5.5.3+,必须升级到较新版本 2、mysql connection版本高于5.1.13 3、修改mysql字符集
按照网上收集资料进行了mysql字符集修改,字符集已经修改如下图,仍然无法插入emoji表情,仔细排查了一下是因为字段未修改成utf8mb4,通过下面第一种方法中的字段修改代码修改后即可成功插入。
查看mysql字符集
SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation%’; 1
第一种:代码方式修改:这里特别注意修改字段类型,否则仍然不会成功
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
/** 网上有些写法不一样,我这里按照下面方式修改保存成功 */ ALTER TABLE table_name MODIFY 字段名 VARCHAR(128) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; 1 2 3 4 5 第二种:mysql工具中手动修改数据库和表 第三种:修改mysql配置文件my.cnf(window为my.ini),修改完成后重启mysql服务
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect=’SET NAMES utf8mb4′ 1 2 3 4 5 6 7 8 9 记录一个小坑,有遇到的朋友可以试试 在使用docker服务器部署mysql时候,mysql字符集通过my.cnf已经设置成了 utf8mb4,使用的Navicat工具连接数据库,无法直接在数据库表格中添加emoji,仍然会报’\xF0\x9F\x8D\x85\xF0\x9F…’错误,通过代码写入,可以写入成功,但是在数据库中查看都是???,这个太坑了,折腾了几个小时仍然没有好,后来用SQLyog客户端工具连接数据库,打开一看都是正常显示,也可以直接在数据库表格中复制粘贴添加emoji表情,不知道是不是Navicat工具的bug。 ———————————————— 版权声明:本文为CSDN博主「F~cjy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yy290879584/article/details/103342043