需求:
h5前端页面显示昵称,兼容含emoji图像的昵称。
技术调研:
通过base_userinfo返回的微信用户信息,含emoji的返回形式为(XX□),微信接口数据达标。
将(XX□)字符输出到文件中复制到数据库(已将数据库、表、字段的编码集改为utf8mb4【为UTF-8的超集,就和UTF-8是acsII的超集一样】)中,编写一个页面调用接口返回查看,返回结果达标。
整体上可行。
实现过程:
1.修改数据库字符集:
a.修改数据库默认配置,linux机器设置my.cnf,windows机器设置my.ini,内容如下:
[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'
character-set-client-handshake = false
b.数据库、表、列字符集修改
ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `表名` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `表名` MODIFY COLUMN `字段` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2.数据库重启
定位命令: locate mysqld
重启命令:mysqld restart
3.校验
检查下是否修改成功。
校验命令:SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';
4.应用修改
数据库链接去掉:characterEncoding
5.异常解析
Caused by: java.sql.SQLException: Incorrect string value: 'xF0x9Fx90xB3aa...' for column 'Content' at row 1
该种错误说明数据库持久层框架暂时不支持emoji的字符,所以报了异常。
解决方案:将配置的数据库url修改下,去掉characterEncoding=utf8
关于重启mysql后,mysql的配置并未生效的问题(笔者在ubuntu18碰到,centos7.3正常),是软件系统默认只读配置问题。改为可读可写即可,修改下即可:
请参考:https://www.cnblogs.com/alsm/p/8079453.html
若是修改之后重启数据库character_set_server依旧没改变,使用如下命令:
set character_set_server=utf8mb4;
参考资料: