1.问题描述
项目需要把excel表格内容插入mysql,但是内容中包含emoji表情,特殊字符,出现错误Incorrect string value: '\xF0\x9F\x98\x84'
2原因
Mysql的UTF-8只支持三个字节的存储,而一般字符是三个字节,但是emoji表情是4个字节,所以存储不了。
为了解决这个问题,Mysql在5.5.3版本之后转而支持了存储4个字节的utf8字符,字符集为utf8mb4.
3.解决办法
3.1修改字符集
线上环境的字符集,显然不好处理,不可能因为一个接口数据修改字符集,当然放弃
3.2过滤掉emoji表情
把特殊字符的内容过滤掉,然后存储
Maven加入依赖如下:
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>5.1.1</version>
</dependency>
String string = EmojiParser.removeAllEmojis(string);
这种方法,缺点就是需要过滤部分内容
3.3转换emoji
github,码农神器,搜索之后发现:https://github.com/vdurmont/emoji-java
开源工具,经过验证之后确实是解决了问题
思路:1.插入的时候,把emoji表情转换为一个别名
2.查询后,把查询结果再把别名转换为原来的emoji表情
Maven 加入
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>5.1.1</version>
</dependency>
第一步:To aliases
String str = "An ?awesome ?string with a few ?emojis!";
String result = EmojiParser.parseToAliases(str);
第二步:
String str = "An :grinning:awesome :smiley:string 😄with a few :wink:emojis!";
String result = EmojiParser.parseToUnicode(str);
参考:MySQL插入emoji表情错误的3种解决方案,Incorrect string value: '\xF0\x9F\x98\x84'