mysql修改成utf8mb4依然无法插入emoji表情问题

最近做项目需要用到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。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值