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

本身的練習項目中涉及保存微信的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的支持,通常可參考以上方法。文章中的關鍵點也說的比較清楚。html

下面是個人處理方法:
要求:java

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;"/>

5.檢查下jdbc鏈接串的設置:

jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8

這裏要注意:有人建議刪除useUnicode=true&characterEncoding=utf8,但好像我這裏會發生保存數據時發生亂碼的現象。

本文重要參考:mysql : utf8mb4 的問題mysql

相關文章
相關標籤/搜索