1. 程式人生 > >微信nickname亂碼(emoji)及mysql編碼格式設定(utf8mb4)解決的過程

微信nickname亂碼(emoji)及mysql編碼格式設定(utf8mb4)解決的過程

轉:https://segmentfault.com/a/1190000004594385

專案中涉及儲存微信的nickname,之前一直正常使用,但是突然遇到一個之前沒有遇到的問題。經過除錯發現錯誤如下:

Incorrect string value: '\xF0\x9F\x99\x88\xF0\x9F...' for column 'nickname' at row 1
經過仔細檢視發現可以獲得nickname的資料,但是無法儲存到mysql資料庫,檢視使用者的微信發現在nickname中使用了emoji字元。
到百度(只能用這個,其他的麻煩呀。)上查詢發現主要解決方案就是MySQL的編碼設定由utf8轉為utf8mb4。
具體解釋可見:[詳細emoji表情與utf8mb4的關係][1] ,寫的非常全面詳細。

網上的解決辦法大多是修改my.cnf引數,設定mysql的編碼為utf8mb4,這種方法雖然徹底,但是通常要重啟mysql,會造成生產系統臨時當機。我認為寫的比較好的方法是:mysql/Java服務端對emoji的支援,一般可參考以上方法。文章中的關鍵點也說的比較清楚。

下面是我的處理方法:
要求:

1.MySQL的版本不能太低,低於5.5.3的版本不支援utf8mb4編碼。select version();
2.JDBC驅動版本不能太低,mysql connector版本高於5.1.13。
<dependency>
    <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> 3.將表中的對應欄位,比如會員表的呢稱欄位,其字符集修改成utf8mb4。 4.最後修改druid資料來源的配置,增加一行: <property name="connectionInitSqls" value="set names utf8mb4;"/> 注意:此處依據不同連線池不同配置不同的引數,比如BoneCP連線池用的是 initSQL 配置
5.檢查下jdbc連線串的設定: jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8 這裡要注意:有人建議刪除useUnicode=true&characterEncoding=utf8,但好像我這裡會發生儲存資料時發生亂碼的現象。