MySql 怎么存取 Emoji表情符?

常见场景:

小程序、公众号、微信头像等广泛应用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