龙空技术网

MySql 怎么存取 Emoji表情符?

数字化转型研习社 111

前言:

眼前看官们对“mysql保存emoji”大约比较关切,各位老铁们都想要剖析一些“mysql保存emoji”的相关内容。那么小编在网络上收集了一些有关“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%';

详见

扩展阅读:

Emoji ( 表情符号)是一种图形符号,能够很直观地反应出某种文字含义。Emoji 是一个日语词(えもじ),E 表示"絵",moji 表示"文字";连在一起就是"絵文字",可以更形象化地表情达意。

unicode 官网上说明

两个解决方法:

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

<dependency>

<groupId>com.github.binarywang</groupId>

<artifactId>java-emoji-converter</artifactId>

<version>0.1.1</version>

</dependency>

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 ?

再见乱码:5分钟读懂MySQL字符集设置

标签: #mysql保存emoji