MySQL不能存储emoji表情的解决方案

问题原因:

数据库中使用的字符编码为UTF-8,这种编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而mysql的utf8编码最多3个字节,所以数据插不进去,而utfmb64是支持四个字节的。所以解决方案就是:将mysql编码从utf8转换成utf8mb4

解决问题的经过

我的数据库环境:MySQL版本是5.7.25,字符集在建库时就选的utf8mb4编码,排序规则如下:我的数据库属性

查看需要保存表情符号的数据库字符集类型:

--查询字符集
SHOW VARIABLES LIKE 'character%';
--更全面的查询字符集
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

结果如下: 查询的数据库字符集
网上的解决方案一般都是字符集设置为utf8mb4即可保存emoji字符,collation_connection 、collation_database 、collation_server是什么没关系,但必须要保证以下变量的字符集是一致的:

--MySQL可操作客户端执行命令
set names utf8mb4;//设置字符集

也可以打开MySQL的控制台,直接在mysql.exe下执行:

set @@character_set_server='utf8mb4';
set @@character_set_database='utf8mb4';

这几个变量必须是utf8mb4:

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

当然,直接修改MySQL的配置文件my.ini也是OK的,不过修改后需要重启MySQL
mysql配置文件

---------------------------------------分割线,重点如下----------------------------------

我开心的用客户端输入emoji表情😊,BUT保存到数据库仍然是???,此时我的内心也是大大的?,我迷惑了,为什么全部字符集都是utf8mb4却仍然不能保存呢

继续找原因。。。。。。。。。。。。。。。。。。。。。。

我以为数据库字符集没有生效,重新执行了以下命令,逐个修改数据库,数据表,需要存储emoji的表字段的字符集:

修改数据库:

ALTER DATABASE mydatabse CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

修改表编码为utf8mb4:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

修改表字段编码为utf8mb4:

【注意】以下命令要修改的字段名(content)就是要写两遍

ALTER TABLE mytable CHANGE content content VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

查看表字段的字符集

show full columns from mytable;

嗯嗯,我觉得现在肯定可以了,BUT仍然不行。。。。。。。。

继续。。。。。。。。。。。。。。。。。。。。

Java后端同事发给我他们数据库连接驱动配置如下:

//如果使用到 spring boot的连接池,请在spring boot 的配置文件application.properties设置连接使用utf8mb64
spring.mysql.datasource.init-sql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci

//设置连接驱动的JDBC_URL
修改如jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull&autoReconnect=true

数据库连接参数中:

characterEncoding=utf8会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。

而autoReconnect=true是必须加上的。

我觉得这次肯定是了,一定是这个数据库连接接字符集的问题,于是我给MySQL连接增加了一个不常用的参数characterEncoding

忘记说了,我程序语言是nodejs,框架是eggjs,使用的MySQL也是egg的插件egg-mysql,配置文件中找到数据库连接参数如下:

第一次配置MySQL连接参数

然而仍然不行!!!我太难了,还好我没放弃,发现这次方向对了,只是egg-mysql配置的连接参数不叫"characterEncoding",而是"charset"

修改后参数配置如下:

第二次配置MySQL连接参数
终于解决啦,这次我开心的输入了我的心情emoji,数据库保存成功!!!!

数据库保存emoji成功

————————————————

                    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/spoliedchild/article/details/102929711

最后修改:2024 年 03 月 25 日
如果觉得我的文章对你有用,请随意赞赏