在做项目的过程中要集成了微信登陆功能,当通过微信登录请求拿到用户的个人信息后保存用户带有表情的昵称时服务抛出了异常。
原因是原来的数据库设置的字符格式(utf-8)不支持emoji表情字符。找到问题后,通过查阅资料,发现只需要将数据的字符格式都设置为utfmb84即可解决。
问题的原因是数据库中使用的字符编码为UTF-8,这种编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而mysql的utf8编码最多3个字节,所以数据插不进去,而utfmb64是支持四个字节的。所以解决方案就是:将mysql编码从utf8转换成utf8mb4。
解决步骤:
1.检查使用的mysql数据库的版本,数据库版本需>=5.5.3版本。(因为使用的是maven打包,还检查了mysql驱动的jar包版本
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
3.重新启动mysql数据库
4 . 检查字符集
SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation%’;
5,存在的数据库的字符集是utf8的,如果要支持utf8mb64则需要将已经存在的数据库、表、表字段类型修改成支持utf8mb64.
修改数据库字符集:
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 CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
以上的操作如果使用navciat可视化工具也可以执行。
6,这步可有可无,前提是如果使用到 spring boot的连接池,请在spring boot 的配置文件application.yml 设置连接使用utf8mb64
spring.mysql.datasource.init-sql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
(因为在本项目中使用的druid数据源所以该配置无效没有起到作用)
7,设置连接驱动的JDBC_URL
本次解决问题心得
出现问题后将问题拆解开来,一段一段测试解决,数据插入时出现问题,先看使用sql语言测试是否可以直接插入相同类型的数据到数据库,其次检查是否是程序端出现了问题。
1.先确定直接使用sql语言可以将带有emoji表情的字符串插入数据库。
(当时数据插入成功后,在数据库中表情字符所显示的是?,但是前台拿到数据可以正常的读取为表情。)
2.当上一步骤可以成功操作后,基本上问题就解决了。如果还是未解决,那么问题就出现在程序这一端了,如果使用springboot,可以看到上面有一段程序配置application.yml配置将其加到配置中即可,如果使用的druid数据源,需要将其加入到druid配置中。
本人是刚毕业的菜鸟,只是想将遇到的问题记录下来并且通过记录去推动自己思考和学习,这些问题根本的原因是什么,以及学习它所牵连的知识。
如果对您有帮助,也是我的荣幸。