微信公衆號開發(坑)-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就不夠用了,只能使用UTF8的超集 utf8mb4 字符集。
於是改了 數據庫的字符集並且重啓了線上的數據庫。 冒着掉腦袋的風險,成功改了字符集,很成功的 大家都收到了監控報警。
一、改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;"/>