微信公眾號開發-emoji表情存庫異常
微信公眾號開發(坑)-emoji表情存庫異常
年後剛來就開始忙,一直在加班。趕進度,上線,終於有時間回來發發部落格:
最近處理的一個微信的坑:
微信網名中:可以使用Emoji表情。但是同樣的就帶來了一系列的問題:
將使用者名稱存入資料庫時候存在異常:
SQL異常如下:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1
那麼該如何解決呢?
看了N多別人的部落格。準備將資料庫改UTF8MB4字符集
原因:
普通的字串或者表情都是佔位3個位元組,所以utf8足夠用了,但是移動端的表情符號佔位是4個位元組,普通的utf8就不夠用了,
於是改了 資料庫的字符集並且重啟了線上的資料庫。 冒著掉腦袋的風險,成功改了字符集,很成功的 大家都收到了監控報警。
一、改Mysql字符集
改全庫字符集 並不複雜:
MYSQL 版本一定要高於 5.5.3 如果低 就升級資料庫吧 (好在我是5.7)
1、編輯 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
我們採用的是主從架構。 一定要主從都改
2、重啟資料庫
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 collation_connection 、collation_database 、collation_server是什麼沒關係。
很成功,重啟服務。發現還是存不進庫。
3、改表結構
原來涉及到的表沒改。 將相關的表改了字符集為UTF8MB4 或者nikename 欄位改UTF8MB4即可。
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
重啟服務,發現問題依然存在。再三檢查。
4、發現JDBC URL characterEncoding=utf8
這個並沒用問題。原來JDBC Driver 版本高於 5.1.13,會自動識別的。
那麼問題出現在哪裡了?
發現我們的架構中Mysql中介軟體是 mysql-proxy 心想是不是這裡出現了問題。
於是先改了Mysql-proxy的字符集。
重啟還是不行。這我就生氣了。然後把mysql-proxy直接去了 tomcat直接連結 主庫。
發現沒問題了。 但是Mysql主從架構必備的。 發現mysql-proxy 代理出來的是 mysql5.1 心想 可能是這裡出了問題。
於是 提議改中介軟體。 改用了MyCat(中介軟體)
果然好了。。。。
其實不改也行。。使用Druid 資料來源 配置一個引數 設定
<property name="connectionInitSqls" value="set names utf8mb4;"/>
只是我們專案無法改資料來源。