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
---------------------------------------分割线,重点如下----------------------------------
我开心的用客户端输入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,配置文件中找到数据库连接参数如下:
然而仍然不行!!!我太难了,还好我没放弃,发现这次方向对了,只是egg-mysql配置的连接参数不叫"characterEncoding",而是"charset"
修改后参数配置如下:
终于解决啦,这次我开心的输入了我的心情emoji,数据库保存成功!!!!
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/spoliedchild/article/details/102929711