問題描述:
當(dāng)存儲含有emoji表情時(shí)闽坡,會拋出類似如下異常:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
這就是字符集不支持的異常钩述。因?yàn)閁TF-8編碼有可能是兩個(gè)、三個(gè)、四個(gè)字節(jié),其中Emoji表情是4個(gè)字節(jié),而Mysql的utf8編碼最多3個(gè)字節(jié)祖凫,所以導(dǎo)致了數(shù)據(jù)插不進(jìn)去
問題處理:
第一步,修改MySQL數(shù)據(jù)庫編碼集為utf8mb4酬凳;
my.cnf一般在etc/mysql/my.cnf位置蝙场。
找到后請?jiān)谝韵氯糠掷锾砑尤缦聝?nèi)容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
修改完數(shù)據(jù)庫的編碼設(shè)置需要對數(shù)據(jù)庫進(jìn)行重啟一下
/etc/init.d/mysql restart
輸入命令,進(jìn)入mysql命令行(mysql -uroot -p)粱年,執(zhí)行如下SQL
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
查看結(jié)果是否如下
+--------------------------+--------------------+
| Variable_name? ? ? ? ? ? | Value? ? ? ? ? ? ? |
+--------------------------+--------------------+
| character_set_client? ? | utf8mb4? ? ? ? ? ? |
| character_set_connection | utf8mb4? ? ? ? ? ? |
| character_set_database? | utf8mb4? ? ? ? ? ? |
| character_set_filesystem | binary? ? ? ? ? ? |
| character_set_results? ? | utf8mb4? ? ? ? ? ? |
| character_set_server? ? | utf8mb4? ? ? ? ? ? |
| character_set_system? ? | utf8? ? ? ? ? ? ? |
| collation_connection? ? | utf8mb4_unicode_ci |
| collation_database? ? ? | utf8mb4_unicode_ci |
| collation_server? ? ? ? | utf8mb4_unicode_ci |
+--------------------------+--------------------+
注:這一步一定在數(shù)據(jù)庫所在服務(wù)器上完成售滤。
第二步,在數(shù)據(jù)庫連接url中的路徑字段設(shè)為
useUnicode=true&characterEncoding=UTF-8&autoReconnect=true;
本地的客戶端上(如Navicat完箩、MySQLWorkBench)可能會因?yàn)榫幋a的問題無法顯示赐俗。
在服務(wù)器的命令行下也可能會因?yàn)榫幋a的問題無法顯示,我們的目標(biāo)是能正常存入弊知,能正常取出阻逮。能正常顯示。
注明:對于 JDBC 連接串設(shè)置了 characterEncoding 為 utf8 或者做了上述配置仍舊無法正常插入 emoji 數(shù)據(jù)的情況秩彤,建議在代碼中指定連接的字符集為 utf8mb4
服務(wù)器:ubuntu0.16.04.1
數(shù)據(jù)庫:MySQL-5.7.22-0ubuntu0.16.04.1
連接端:JDBC
外部驅(qū)動(dòng):C3P0
語言環(huán)境:JAVA
參考文檔:
utf8 和 utf8mb4 的區(qū)別 : https://mathiasbynens.be/notes/mysql-utf8mb4
可參考網(wǎng)址:
https://blog.csdn.net/testcs_dn/article/details/75533784
https://segmentfault.com/a/1190000000616820
https://www.cnblogs.com/aksir/p/7070493.html
需要進(jìn)一步解決的問題
1叔扼、為什么在客戶端不能正常顯示emoji表情(Nactivcat 、MySQL workbench)
Unicode 只是規(guī)定了 Emoji 的碼點(diǎn)和含義漫雷,并沒有規(guī)定它的樣式瓜富。舉例來說,碼點(diǎn)U+1F600表示一張微笑的臉降盹,但是這張臉長什么樣与柑,則由各個(gè)系統(tǒng)自己實(shí)現(xiàn)。
因此蓄坏,當(dāng)我們輸入這個(gè) Emoji 的時(shí)候价捧,并不能保證所有用戶看到的都是同一張臉。如果用戶的系統(tǒng)沒有實(shí)現(xiàn)這個(gè) Emoji 符號涡戳,用戶就會看到一個(gè)沒有內(nèi)容的方框结蟋,因?yàn)橄到y(tǒng)無法渲染這個(gè)碼點(diǎn)。
參考網(wǎng)址:https://blog.csdn.net/zhang__ao/article/details/78061568
2渔彰、set names 的原理
SET NAMES x
相當(dāng)于
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
所以說:
set names utf8mb4指定了客戶端和服務(wù)器之間傳遞字符的編碼規(guī)則為utf8mb4嵌屎。
參考網(wǎng)址:https://blog.csdn.net/kakarot5/article/details/40088137
? ? https://blog.csdn.net/y_h_t/article/details/17994335
3、https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html
4胳岂、https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
MySQL中的字符序名稱遵從命名慣例:以字符序?qū)?yīng)的字符集名稱開頭编整;以_ci(表示大小寫不敏感)舔稀、_cs(表示大小寫敏感)或_bin(表示按編碼值比較)結(jié)尾乳丰。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等價(jià)的内贮;