常见场景:
小程序、公众号、微信头像等广泛应用Emoji表情符号,存储到数据库的时候导致程序异常。
错误异常:
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1
原因分析:
mysql数据库的字符编码一般是 utf8(支持的编码范围为 \u0000-\uFFFF)只支持三个字节的存储,而 Emoji 所在的编码范围是 \u1F601-\u1F64F,是4个字节,超出 MySql 的边界了。 utf8mb4 是 MySql 在 5.5.3 版本之后增加的一个编码方式, utf8mb4 是 utf8 的超集,其中 mb4 是 most bytes 4 的意思,将字符集修改为“utf8mb4”,并不会对已有的 utf8 编码读取产生任何问题。
查看编码 show variables like ‘%char%’;
详见 https://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html
扩展阅读:
Emoji ( 表情符号)是一种图形符号,能够很直观地反应出某种文字含义。Emoji 是一个日语词(えもじ),E 表示"絵",moji 表示"文字";连在一起就是"絵文字",可以更形象化地表情达意。
unicode 官网上说明 http://unicode.org/emoji/charts/full-emoji-list.html
两个解决方法:
1、 修改mysql数据字符集(5.5.3以上版本)
设置字段列设置为utf8mb4
ALTER TABLE table_name MODIFY colum_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
设置下表的字符集
ALTER TABLE table_name CHARSET=utf8mb4;
更改数据库编码:
ALTER DATABASE caitu99 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
然后重启mysql
service mysqld restart
测试:
INSERT INTO tb_test (id,name) VALUES (55, x’F09F9A8A’);
为了建表方便,可以修改 my.cnf:
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
2、EmojiConverter(兼容所有版本的数据)
GitHub 上的EmojiConverter库,它可以很方便地将 Emoji 转换为字符串的别名,同时也支持将这个别名转换为 Emoji。
1)在 pom.xml 文件中加入 EmojiConverter
com.github.binarywang
java-emoji-converter
0.1.1
2)存储 Emoji 之前调用 toHtml() 方法转换一下
EmojiConverter emojiConverter = EmojiConverter.getInstance();
String html = emojiConverter.toHtml(keywords.getContent().trim());
// JFinal 的保存方式
Record record = new Record().set(“content”, html)
Db.save(“keywords”, record);
3)显示 Emoji 的时候调用 toUnicode() 方法格式化一下
javaString unicode = emojiConverter.toUnicode(content);
outMsg.setContent(unicode);
参考阅读
如何在 MySQL 中存储 emoji ? https://linux.cn/article-7700-1.html
再见乱码:5分钟读懂MySQL字符集设置 https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html