问题原因:
微信昵称是可以添加emoji表情的,当我们保存带有emoji的昵称时,mysql数据库会报错
原因是我们使用mysql数据库存储格式一般是utf8,而mysql的“utf8”实际上不是真正的 UTF-8。
“utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。
mysql的“utf8mb4”是真正的“UTF-8”。
而emoji恰恰就是四个字节,所以保存的时候会报错。
解决办法:
1.把mysql数据库格式utf8改成utf8mb4
将my.ini(win)文件配置修改,如下
[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'
发现还有两个问题会继续导致字符不兼容的问题:
1.JDBC连接串的问题,有些项目在jdbc连接串里指定了编码,例如:
jdbc:mysql://localhost/mydb?characterEncoding=UTF-8
2.字符集修改之后要将相关表结构中的表的字符集以及表中字段的字符集也修改为utf8mb4
2.使用一个轻量级框架emoji-java
github地址:https://github.com/vdurmont/emoji-java
这个思路是将emoji按照框架里保存的类似枚举类型的emoji进行对比,如果匹配到了,就将emoji转成:cry:
类似这种格式的字符串保存到数据库中,拿的时候再去匹配,如果包含这种格式的Aliases,就解析成emoji
但是这又有两个问题,1.生产环境中可能会有各种的emoji,如果emoji-java框架没有这种emoji,数据库还是会报错
2.小概率如果有字段带有:cry:这种格式,会将他转成emoji