解決emoji表情的數據庫存取問題:Cause: java.sql.SQLException: Incorrect string value

移動端進行可以帶Emoji表情的評論或是寫文章時,存入數據庫時報以下錯誤疑問

### Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8D\xB3\xF0\x9F...' for column 'CONTENT' at row 1

問題原因分析驚訝:普通的字符串或者表情都是佔位3個字節,所以utf8足夠用了,但是移動端的emoji表情符號佔位是4個字節,普通的utf8就不夠用了,爲了應對無線互聯網的機遇和挑戰、避免 emoji 表情符號帶來的問題、涉及無線相關的 MySQL 數據庫建議都提前採用 utf8mb4字符集,這必須要作爲移動互聯網行業的一個技術選型的要點,嘛,簡單地說就是如果你的數據庫設計移動端的使用,那麼最後將數據庫的字符集改成utf8mb4的。


問題解決奮鬥:經過本人的測試,只需要簡單的幾步即可解決問題,不過前提是Mysql數據庫的版本需要大於5.5.3版本、從庫也必須是5.5.3以上的了、低版本不支持這個字符集、複製報錯。

1.先設置數據庫表對應字段(列)的字符集爲utf8mb4:

ALTER TABLE USER_CONTENT MODIFY `CONTENT` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '評論內容';

然後重新啓動Mysql數據庫(不過只是修改字段的話可以不用重啓),確認設置生效:mysql> show VARIABLES like '%char%';

當然也可以使用數據庫管理工具直接修改,如下圖:


2.在進行數據的插入和更新操作前執行sql:set names utf8mb4;如使用mybatis時創建如下方法,在執行其他sql語句前調用即可:

@Select("SET NAMES 'utf8mb4'")

public void setUTF8MB4();

其實也可以通過配置來解決,如在數據庫的連接池配置中使用:<property name="connectionInitSqls" value="set names utf8mb4;" />

重啓應用,問題解決。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章