问题描述:
有时候数据中含有一些字段是含有字符表情,数据库设置为utf-8编码还是会出现问题如下:
解决办法:
- 原来Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。直接的方法就是直接替换掉
str.replaceAll("[^\u0000-\uFFFF]", "")
; - 修改数据库的编码:将Mysql的编码从utf8转换成utf8mb4,但是会引入性能问题,utf8mb4的性能可能比utf8系列的collations低。utf8mb4最大可存储的字符可能少于utf8系列的collation;在索引中,对于文本类型的字段,utf8mb4可索引的字符少于utf8系列的collations。如InnoDB的索引最多使用767字节。如果使用utf8mb4,每一个字符都会预留4字节做索引,而utf8则预留3字节。故此前者是191个字符,后者是255个字符
- 转义表情符号,把表情符号转义存入数据库,查询出来的时候再解析成表情符号。
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
<scope>compile</scope>
</dependency>
使用方法:
//转义
System.out.println(EmojiParser.parseToAliases("😄😄😄😄😄😄").replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", ""));
//解析
System.out.println(EmojiParser.parseToUnicode(":smile::smile::smile::smile::smile::smile:"));