现在emoji表情非常流行,用户使用App输入文本时都会加入emoji表情。如果在移动端发布文本内容时包含了这种emoji表情符号,通过接口传递到服务器端,服务器端再存入MySQL数据库可能出现:
- 使用UTF-8字符集的数据库无法正常插入内容数据。异常信息为 Incorrect string value: '\xXX\xXX\xXX\xXX' for column......
- 使用GBK字符集的数据库虽然能正常插入数据,但回显会变成□□□□□□的乱码形式
原因在于MySQL中utf8字符集只支持三字节UTF-8编码的Unicode范围,而emoji字符属于四字节编码部分。
解决办法:
-
将数据库字符集更改为utf8mb4(utf8与utf8mb4区别见官方文档 https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-conversion.html)
在MySQL配置文件my.cnf中增加如下配置,并重启服务。character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
这种方式下后续需要将库,表,索引等的字符集全部更新成utf8mb4,工作量较大。
-- utf8时表结构 CREATE TABLE t1 ( col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ) CHARACTER SET utf8;
--更新成utf8mb4 ALTER TABLE t1 DEFAULT CHARACTER SET utf8mb4, MODIFY col1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, MODIFY col2 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;
我认为这种方式比较适合初期表模型设计阶段。这样避免大量修改工作导致的错误。
- 将emoji表情和自定义的规则进行映射,从而将无法存储的字符转换为可以存储的字符。比如🎹就对应成 :musical_keyboard:
已经有现成的第三方库可以使用(https://github.com/vdurmont/emoji-java)。
字符截断可能会有问题:
假如数据库中存储的内容是 Music🎹🎧音乐大师
现在有个需求要求将内容的前6个字符作为摘要显示。使用substring(0,6)直接截取 就会出现问题。
网友评论