1. 程式人生 > >微信公眾號開發-emoji表情存庫異常

微信公眾號開發-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就不夠用了,

只能使用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;"/>
只是我們專案無法改資料來源。