Mysql存储微信Emoji表情问题,及Illegal mix of collations,utf8mb4_unicode_ci和utf8mb4_general_ci

报错如下:

insertTable 发生异常: (1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x85\\xF0\\x9F...' for column 'content' at row 1")

或者

Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

上面错误意思是 mysql 数据库中 content字段插入不正确的字符串值content字段是记录微信评论带表情,设计之初没有考虑到微信呢称中使用 Emoji 表情,导致写入数据失败。

utf8 为什么不支持 Emoji

utf8不支持emoji,是因为emoji是用4个字节存储的字符,而mysql的utf8只能存储1-3个字节的字符。

解决方法

vi /etc/mysql/my.cnf,如下文件

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

在下面追加

[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'

重启数据库,检查变量

mysql>  SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

必须保证下面几个变量是 utf8mb4

系统变量               描述
character_set_client  客户端来源数据使用的字符集
character_set_connection  连接层字符集
character_set_database 当前选中数据库的默认字符集
character_set_results  查询结果字符集
character_set_server  默认的内部操作字符集

将数据库 和 已经建好的表也转换成 utf8mb4

ALTER DATABASE `webMysqlDBTemp` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE `task_comment_tb` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 更改表编码
ALTER TABLE `task_comment_tb` CHANGE `content` VARCHAR(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  # 更改列的编码

#用户表也要更改
ALTER TABLE user_info_tb CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `user_info_tb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

查询字符集编码

show create database webMysqlDBTemp; # 查询数据库编码
show create table user_info_tb; # 查询表编码
show full columns from user_info_tb; # 查询所有表字段编码

数据库连接配置

添加 characterEncoding=utf8 会被自动识别为 utf8mb4 ;autoReconnect=true 参数必须添加。

重启数据库

service mysql restart

就OK了

 

参考:

https://zhuanlan.zhihu.com/p/101325875

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值