移動端進行可以帶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;" />
重啓應用,問題解決。