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

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

druid druid數據源 rect local 比較 也說 connector ref 調試

轉: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,但好像我這裏會發生保存數據時發生亂碼的現象。

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