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

MySql 怎麼存取 Emoji表情符?

兩個解決方法:

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>

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


分享到:


相關文章: