對emoji表情包的支持纵苛,網(wǎng)上有很多方案了剿涮。大體分為如下兩大類:
1. 基于java對表情字符串編碼預(yù)處理。
網(wǎng)上所有基于java對表情字符串編碼預(yù)處理的方案攻人,大體又分為如下幾類:
將字符串中的表情字符串剔除
如果我們基于編碼范圍進(jìn)行提出取试,就可能提出不干凈。因?yàn)楸砬榭赡苡?utf8mb4 范圍內(nèi)utf8 范圍外的字符和 utf8 范圍內(nèi)的字符構(gòu)成怀吻,我們剔除調(diào) utf8mb4 內(nèi) utf8 外的字符了瞬浓,那么屬于表情一部分,但屬于 utf8 范圍內(nèi)的字符很可能被留下蓬坡,從而留下殘余垃圾猿棉;同時磅叛,剔除字符串,會導(dǎo)致用戶的原始輸入被篡改萨赁,顯然并不是非常合適弊琴。將字符串中的表情字符串替換為可識別的其他字符串
這種方案的缺點(diǎn),在于emoji表情本身在不停的發(fā)展中≌人現(xiàn)有方案無法預(yù)知未來可能會出現(xiàn)的所有的emoji表情敲董,最終總會出現(xiàn)不支持的新增表情。我們只能不斷被動更新我們的表情庫來支持新表情慰安。
而實(shí)際上腋寨,我們很難及時更新我們支持的表情庫。甚至我們的程序根本就不支持動態(tài)更新表情庫化焕。即便可以更新表情庫精置,我們也無法跟進(jìn)全世界的表情作者的進(jìn)展。
2. 修改數(shù)據(jù)庫存儲锣杂,使其支持utf8mb4編碼字符集
該方案不修篡改用戶的原始輸入脂倦,顯然是最理想的方案。
3. 操作步驟
3.1. 修改數(shù)據(jù)庫的字符集
阿里云的rds元莫,默認(rèn)使用utf8編碼赖阻。
自維的mysql數(shù)據(jù)庫和阿里云的rds數(shù)據(jù)庫,維護(hù)方法略有差異踱蠢。
自維的mysql數(shù)據(jù)庫火欧,我們需要自己修改數(shù)據(jù)庫的my.cnf(或類似)配置文件,然后重啟mysql數(shù)據(jù)庫茎截。
而阿里云的rds數(shù)據(jù)庫苇侵,我們無法直接修改其配置文件,只能通過阿里云的控制臺進(jìn)行修改企锌。阿里云的文檔庫中榆浓,有關(guān)于如下修改阿里云的mysql數(shù)據(jù)庫字符集的文章通過RDS控制臺修改MySql數(shù)據(jù)庫編碼方法。
實(shí)際上陡鹃,就是先打開rds實(shí)例列表:
然后選擇要修改的rds實(shí)例后,點(diǎn)擊右方的“參數(shù)設(shè)置”菜單:
接下來找到 charactor_set_server 參數(shù)抖坪,再修改為 utf8mb4萍鲸。
為安全起見,還可以再執(zhí)行一條修改數(shù)據(jù)庫編碼的sql語句:
ALTER DATABASE <數(shù)據(jù)庫名> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
3.2 修改表的字符集
修改表的字符集擦俐,需要按表逐一執(zhí)行語句脊阴。如果表數(shù)量比較多的話,可以用如下代碼生成修改表編碼的sql:
select concat('ALTER TABLE ', substr(t.name, 7, length(t.name)), ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
from innodb_sys_tables t
where t.name like 'your_db_name%';
需要注意的是:
substr(t.name, 7, length(t.name)):這段代碼的意思,是截取表名嘿期。
mysql的 innodb_sys_tables.names 屬性品擎,其值格式為 your_db_name/your_table_name;因此秽五,需要截掉your_db_name/部分孽查。
我用作例子的數(shù)據(jù)庫饥悴,數(shù)據(jù)庫名字加上 / 坦喘,一共是6個字符。從第7個字符開始保留西设,因此mysql的substr函數(shù)的第二個參數(shù)值為7
最后瓣铣,我們執(zhí)行上述語句生成的結(jié)果字符串,就可以修改所有表的字符集了贷揽。
3.3 重啟數(shù)據(jù)庫實(shí)例
我們可以在控制臺上棠笑,進(jìn)入rds詳情界面后,點(diǎn)擊右上方工具欄上的“重啟實(shí)例”來重啟rds:
最后禽绪,我們可以執(zhí)行下列語句來驗(yàn)證數(shù)據(jù)庫的編碼是否已經(jīng)修改過來了:
SHOW CREATE DATABASE your_db_name;
SHOW CREATE TABLE your_table_name;
3.4 修改mycat配置為使用utf8mb4編碼
找到 mycat/conf/serer.xml蓖救,在其中添加如下內(nèi)容即可:
<property name="charset">utf8mb4</property>
3.3 修改jdbc連接的字符集
假設(shè)mysql服務(wù)器hostname為 rds.yourdbsrv.cn,端口為3306印屁,數(shù)據(jù)庫名為 your_db 則不指定字符集的連接字符為:
jdbc:mysql://rds.yourdbsrv.cn:3306/your_db
指定字符集為utf8mb4的連接字符串為:
jdbc:mysql://rds.yourdbsrv.cn:3306/your_db?useUnicode=true&characterEncoding=utf8mb4