数据库存储emoji表情 Incorrect string value: ‘\xF0\x9F\x91\x80‘ for column

记一次项目中存储微信昵称时的异常
Incorrect string value: ‘\xF0\x9F\x91\x80’ for column

在项目中会统一编码集,utf8是可变长的,有1—4个字节,emoji表情或者其他字符就是4字节,而mysql5.3.3之前的utf8最多3字节,所以数据插入不进去。而之后版本的utf8mb4就是4个字节了,解决方法也就是从utf8换成utf8mb4

可使用show variables like "%character%";查看mysql的编码,show variables like "%version%";查看mysql版本

解决方法

前提:mysql版本5.5.3之上、mysql-connector-java驱动不要低于5.1.13(这个没有试过,总之不要过低)

  1. 修改mysql安装目录中的my.ini(如果只有my-default.ini,将其改名为my.ini,或者 没有my.ini就创建一个)
[mysqld]
# 设置3306端口
port = 3306
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
    
# 注意:是 utf8mb4_unicode_ci,不是 utf8mb4_general_ci
collation-server=utf8mb4_unicode_ci
#查看binlog时忽略掉,提示警告
#loose-default-character-set = utf8mb4
    
init_connect=’SET NAMES utf8mb4’
    
character-set-client-handshake = FALSE

# 设置mysql的安装目录 即mysql根目录
basedir=D:\javaPackage\mysql-5.7.32-winx64
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
datadir=D:\javaPackage\mysql-5.7.32-winx64\data

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# Set the SQL mode to strict
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

# 配置慢查询,5.7版本默认为1
slow-query-log=1
slow_query_log_file="user-slow.log"
long_query_time=10

#错误信息文件设置,会将错误信息放在data/mysql.err文件下
log-error=mysql.err

#lower_case_table_names: 此参数不可以动态修改,必须重启数据库
#lower_case_table_names = 1  表名存储在磁盘是小写的,但是比较的时候是不区分大小写
#lower_case_table_names=0  表名存储为给定的大小和比较是区分大小写的 
#lower_case_table_names=2, 表名存储为给定的大小写但是比较的时候是小写的
lower_case_table_names=1

#跳过密码验证
#skip-grant-tables

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
    
#查看binlog时忽略掉,提示警告
#loose-default-character-set = utf8mb4

[mysql]
default-character-set=utf8mb4

重要的就只有

[mysqld]
character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci

init_connect=’SET NAMES utf8mb4’
character-set-client-handshake = FALSE

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

以上将mysql服务器的编码修改为了utf8mb4

修改完后,重启mysql windows下以管理员身份打开运行:net stop mysql、net start mysql

使用show variables like "%character%";查看mysql的编码
在这里插入图片描述

  1. 对于已存在的数据库和数据表以下面的命令进行修改编码
ALTER TABLE tableName CONVERT TO CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;
ALTER DATABASE databaseName CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  1. 修改druid 或者 其他的DataSource配置(这个必须要有,不只是my.ini中已经有了就可以解决的)
<!-- 解决mysql保存emoji报错 -->
<property name="connectionInitSqls" value="set names utf8mb4;"/>

数据库连接:useUnicode=true&characterEncoding=utf8&autoReconnect=true

喝水不忘挖井人 https://blog.csdn.net/alinyua/article/details/79599540

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值