如何解決emoji表情插入MySQL數(shù)據(jù)庫問題

問題描述:

當(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à)的内贮;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产园,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夜郁,更是在濱河造成了極大的恐慌什燕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竞端,死亡現(xiàn)場離奇詭異屎即,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門技俐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乘陪,“玉大人,你說我怎么就攤上這事雕擂》纫兀” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵井赌,是天一觀的道長谤逼。 經(jīng)常有香客問我,道長仇穗,這世上最難降的妖魔是什么流部? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮仪缸,結(jié)果婚禮上贵涵,老公的妹妹穿的比我還像新娘。我一直安慰自己恰画,他們只是感情好宾茂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拴还,像睡著了一般跨晴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上片林,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天端盆,我揣著相機(jī)與錄音,去河邊找鬼费封。 笑死焕妙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弓摘。 我是一名探鬼主播焚鹊,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼韧献!你這毒婦竟也來了末患?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤锤窑,失蹤者是張志新(化名)和其女友劉穎璧针,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渊啰,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡探橱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年申屹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隧膏。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡独柑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出私植,到底是詐尸還是另有隱情忌栅,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布曲稼,位于F島的核電站索绪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贫悄。R本人自食惡果不足惜瑞驱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窄坦。 院中可真熱鬧唤反,春花似錦、人聲如沸鸭津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆趋。三九已至盏阶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闻书,已是汗流浹背名斟。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魄眉,地道東北人砰盐。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像坑律,于是被迫代替她去往敵國和親岩梳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容