最近做项目需要用到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
开发环境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
上网查询了一下资料,锁定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%';
第一种:代码方式修改:这里特别注意修改字段类型,否则仍然不会成功
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;
第二种: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'
记录一个小坑,有遇到的朋友可以试试
在使用docker服务器部署mysql时候,mysql字符集通过my.cnf已经设置成了 utf8mb4,使用的Navicat工具连接数据库,无法直接在数据库表格中添加emoji,仍然会报’\xF0\x9F\x8D\x85\xF0\x9F…'错误,通过代码写入,可以写入成功,但是在数据库中查看都是???,这个太坑了,折腾了几个小时仍然没有好,后来用SQLyog客户端工具连接数据库,打开一看都是正常显示,也可以直接在数据库表格中复制粘贴添加emoji表情,不知道是不是Navicat工具的bug。