微信nickname亂碼(emoji)及mysql編碼格式設定(utf8mb4)解決的過程__https://segmentfault.com/a/1190000004594385
阿新 • • 發佈:2018-11-12
自己的練習專案中涉及儲存微信的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;"/>
5.檢查下jdbc連線串的設定:
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8
這裡要注意:有人建議刪除useUnicode=true&characterEncoding=utf8,但好像我這裡會發生儲存資料時發生亂碼的現象。
本文重要參考:mysql : utf8mb4 的問題