阿里雲RDS for MySQL數據庫爲存儲Emoji表情 將編碼方式改成utf8mb4

原由

最近在公司的APP項目中出現了,手機移動端輸入法輸入Emoji表情和火星文等特殊字符時,後臺接口存入數據庫報錯的問題。錯誤爲以下形式html

Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1

 

分析

  • 網上查了一下問題是移動端的emoji表情爲四個字節,而MySQL的utf8編碼方式的數據爲三個字節。將MySQL的utf8編碼改成utf8mb4編碼方式就能夠進行存儲了。
  • 這裏須要注意MySQL必須是5.5.3以上版本的,咱們公司使用的是5.6版本因此沒有問題能夠改。
  • 其實移動端項目一開始就應該把數據庫設置成utf8mb4編碼方式的,不必都開始運營了才改。無奈以前沒有移動端開發的經驗犯了這種低級錯誤。
  • 網上不少修改的方法,可是咱們的項目使用的是阿里雲的RDS數據庫,我記錄一下變動的過程方便一樣狀況的朋友解決問題。

 

過程

如下過程主要參考了阿里雲官方幫助文檔《RDS MySQL使用utf8mb4字符集存儲emoji表情》java

 

一、查看是否支持utf8mb4

    在數據庫client終端查看數據庫是否支持utf8mb4編碼方式mysql

  1. SHOW CHAR SET WHERE Charset LIKE "%utf8%";

 

二、修改參數

在RDS控制檯-參數配置功能中修改character_set_server參數爲utf8mb4。spring

修改後須要重啓實例方可生效。                  sql

三、在RDS中建立新的數據庫

RDS for MySQL數據庫並不支持修改編碼方式,因此要經過新建數據表,而後導數據的方式進行變動。數據庫

四、老數據庫數據遷移到新庫

五、改變原數據表的編碼方式

原來已經生成的數據表須要修改編碼方式測試

-- ex_company 爲要修改的表名
ALTER TABLE ex_company CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

 

*修改編碼方式的過程當中出現了兩個問題阿里雲

1)現了一個錯誤「utf8mb4 Specified key was too long; max key length is 767 bytes」編碼

此錯誤的問題在於MySQL數據庫創建索引的字段不能超過767個字節,若是創建索引的字段原來是utf8編碼(3字節),那麼255*3=765能夠創建爲索引。如今若是改爲utf8mb4編碼(4字節),那麼255*4=1020顯然超過767個字節的規定。能夠將創建索引的字段字符數改少(191正好764)來解決此問題。url

alter table ex_order_base modify column sn varchar(191);

2)沒有varchar類型字段的數據表編碼格式不會改,沒弄清楚爲何。

 

六、去掉數據庫連接參數中的編碼方式

去掉jdbc連接參數中的「useUnicode=true」和「characterEncoding=UTF-8」參數              

修改前:

spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/pltx-test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

修改後:

spring.datasource.url=jdbc:mysql://rdso30006c33s57oufvfo.mysql.rds.aliyuncs.com:3306/pltx-test?zeroDateTimeBehavior=convertToNull

 

七、將項目jdbc鏈接指向新的數據庫地址

 

至此本次變動完成,連接客戶端測試一切正常。

相關文章
相關標籤/搜索