mysql/Java服務端對emoji的支持

問題描述:

如果UTF8字符集且是Java服務器的話齿税,當存儲含有emoji表情時挖函,會拋出類似如下異常:

java.sql.SQLException: Incorrectstringvalue:'\xF0\x9F\x92\x94'forcolumn'name'at row1at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) ?? ? at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) ?? ? at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) ?? ? at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) ?? ? at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) ?? ? at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) ?? ? at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662) ?? ? at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

這就是字符集不支持的異常省核。因為UTF-8編碼有可能是兩個考婴、三個宰衙、四個字節(jié)幅狮,其中Emoji表情是4個字節(jié)能岩,而Mysql的utf8編碼最多3個字節(jié)寞宫,所以導致了數據插不進去。

升級前需要考慮的問題:

如果你的項目要進行移動產品的用戶文本的存儲捧灰,將你的DB字符集從UTF8/GBK等傳統(tǒng)字符集升級到utf8mb4將是勢在必行淆九。你可以通過應用層面轉換emoji等特殊字符,以達到原DB的兼容毛俏,我認為可行炭庙,但是你可能走了彎路。

utf8mb4作為utf8的super set煌寇,完全向下兼容焕蹄,所以不用擔心字符的兼容性問題。切換中需要顧慮的主要影響是mysql需要重新啟動(雖然mysql官方文檔說可以動態(tài)修改配置阀溶,但是經過數次測試腻脏,還是需要重啟才可生效)鸦泳,對于業(yè)務可用率的影響是需要考慮的大問題,這里就暫時不展開討論了永品。

升級步驟:

1.utf8mb4的最低mysql版本支持版本為5.5.3+做鹰,若不是,請升級到較新版本鼎姐。

mysql版本查看命令請看:查看mysql版本的四種方法钾麸;mysql安裝步驟請看:Linux中升級Mysql到Mysql最新版本的方法

2.修改database、table和column字符集炕桨。參考以下語句:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3.修改mysql配置文件my.cnf(windows為my.ini)

my.cnf一般在etc/mysql/my.cnf位置饭尝。找到后請在以下三部分里添加如下內容:

[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'

4.重啟 MySQL Server、檢查字符集

1.)重啟命令參考:/etc/init.d/mysql restart

2.)輸入命令:mysql献宫,進入mysql命令行(如果提示沒權限钥平,可以嘗試輸入mysql -uroot -p你的密碼)

3.)在mysql命令行中輸入:SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

檢查是否如下:

+--------------------------+--------------------+

| 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 |

+--------------------------+--------------------+

rows in set (0.00 sec)

特別說明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,沒有關系姊途。但必須保證character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server為utf8mb4涉瘾。關于這些字符集配置是干什么用的,有什么區(qū)別吭净,請參考:深入Mysql字符集設置

5.如果你用的是java服務器睡汹,升級或確保你的mysql connector版本高于5.1.13,否則仍然無法使用utf8mb4

這是mysql官方release note寂殉,大家可以查看說明,并下載最新的mysql connector for java的jar包原在。

這里為大家提供一個:mysql-connector-java-5.1.31-bin.jar

同時記得修改pom配置哦~

6.檢查你服務端的db配置文件:

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE

jdbc.username=root

jdbc.password=password

特別說明其中的jdbc.url配置:如果你已經升級好了mysql-connector友扰,其中的characterEncoding=utf8可以被自動被識別為utf8mb4(當然也兼容原來的utf8),而autoReconnect配置我強烈建議配上庶柿,我之前就是忽略了這個屬性村怪,導致因為緩存緣故,沒有讀取到DB最新配置浮庐,導致一直無法使用utf8mb4字符集甚负,多么痛的領悟!审残!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末梭域,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子搅轿,更是在濱河造成了極大的恐慌病涨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧坟,死亡現場離奇詭異既穆,居然都是意外死亡赎懦,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門幻工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來励两,“玉大人,你說我怎么就攤上這事囊颅》ソ” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵迁酸,是天一觀的道長先鱼。 經常有香客問我,道長奸鬓,這世上最難降的妖魔是什么焙畔? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮串远,結果婚禮上宏多,老公的妹妹穿的比我還像新娘。我一直安慰自己澡罚,他們只是感情好伸但,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著留搔,像睡著了一般更胖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隔显,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天却妨,我揣著相機與錄音,去河邊找鬼括眠。 笑死彪标,一個胖子當著我的面吹牛,可吹牛的內容都是我干的掷豺。 我是一名探鬼主播捞烟,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼当船!你這毒婦竟也來了题画?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤生年,失蹤者是張志新(化名)和其女友劉穎婴程,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體抱婉,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡档叔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年桌粉,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙四。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡铃肯,死狀恐怖,靈堂內的尸體忽然破棺而出传蹈,到底是詐尸還是另有隱情押逼,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布惦界,位于F島的核電站挑格,受9級特大地震影響,放射性物質發(fā)生泄漏沾歪。R本人自食惡果不足惜漂彤,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灾搏。 院中可真熱鬧挫望,春花似錦、人聲如沸狂窑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泉哈。三九已至蛉幸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旨巷,已是汗流浹背巨缘。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留采呐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓搁骑,卻偏偏與公主長得像斧吐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仲器,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容

  • 移動項目必定少不了emoji煤率,如果你的項目有微信登陸等第三方授權,而且你的用戶名是獲取微信的用戶名乏冀,那必須要對em...
    Owater閱讀 2,443評論 0 5
  • 1蝶糯、問題:mysql 遇到某些中文插入異常最近有同學反饋了這樣一個問題: 上述語句在腳本中 load 入庫的時候會...
    kanasu閱讀 2,820評論 1 5
  • MySQL數據庫對象與應用 2.1-MySQL數據類型 庫建立好之后基本不動,和我們接觸最頻繁的是表. 建表就是聲...
    極客圈閱讀 2,129評論 0 8
  • 一直都覺得自己是個很樂觀自信的女孩紙,卻不知從何時起辆沦,隔段時間就會對自己不自信昼捍,甚至覺得有挫敗感…… 歸其原因...
    吖婷爺閱讀 201評論 0 0
  • 01 初見 他在風沙中走了許久识虚,就在快要支撐不住的時候,一間客棧忽地闖入他的視線妒茬。透過漫漫黃沙看去担锤,客棧忽隱忽現,...
    虎牙韶光閱讀 759評論 0 2