阿里雲RDS for MySQL使用utf8mb4編碼儲存Emoji表情
問題描述
公司的APP專案中輸入Emoji表情和火星文等特殊字元時,後臺介面存入資料庫報錯,錯誤資訊如下:
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版本所以沒有問題可以改。
解決過程
本文主要參考了阿里雲官方幫助文件《RDS MySQL使用utf8mb4字符集儲存emoji表情》
1、檢視資料庫是否支援utf8mb4
在資料庫client終端檢視資料庫是否支援utf8mb4編碼方式
SHOW CHAR SET WHERE Charset LIKE "%utf8%";
2、修改引數
在RDS控制檯-引數配置功能中修改character_set_server引數為utf8mb4。
修改後需要重啟例項方可生效。
3、在RDS中建立新的資料庫
RDS for MySQL資料庫並不支援修改編碼方式,所以要通過新建資料表,然後導資料的方式進行變更。
4、老資料庫資料遷移到新庫
5、改變原資料表的編碼方式
原來已經生成的資料表需要修改編碼方式
-- ex_company 為要修改的表名
ALTER TABLE ex_company CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
修改編碼方式的過程中出現了兩個問題
- 資料庫報錯“utf8mb4 Specified key was too long; max key length is 767 bytes”。此錯誤的問題在於MySQL資料庫建立索引的欄位不能超過767個位元組,如果建立索引的欄位原來是utf8編碼(3位元組),那麼2553=765可以建立為索引。現在如果改成utf8mb4編碼(4位元組),那麼2554=1020顯然超過767個位元組的規定。可以將建立索引的欄位字元數改少(191正好764)來解決此問題。
alter table ex_order_base modify column sn varchar(191);
- 沒有varchar型別欄位的資料表編碼格式不會改。
6、去掉資料庫連結引數中的編碼方式
去掉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
7、將專案jdbc連線指向新的資料庫地址
至此本次變更完成,連結客戶端測試一切正常。
相關文章
- mysql 儲存emoji表情MySql
- MySQL儲存 emoji 表情MySql
- Mysql支援emoji 表情符號 升級編碼為UTF8MB4MySql符號
- MySQL 04-EMOJI 表情與 UTF8MB4 的故事MySql
- MySQL 資料庫儲存 Emoji 表情及特殊符號MySql資料庫符號
- iOS Emoji表情編碼/解碼iOS
- emoji等表情符號存mysql的方法符號MySql
- MySQL 支援 emoji 圖示儲存MySql
- Mysql伺服器無法存emoji表情的解決方案MySql伺服器
- 在 Laravel 中使用 emoji 表情Laravel
- 【Mysql】關於mysql存入emoji表情的問題MySql
- MySQL設定utf8mb4編碼MySql
- MYSQL資料庫與Emoji表情的故事MySql資料庫
- php+mysql 解決emoji表情符號問題PHPMySql符號
- 容器化RDS—— 計算儲存分離 or 本地儲存
- 判斷字串中是否包含Emoji表情程式碼字串
- iOS使用Unicode9.0 emoji表情的方法iOSUnicode
- 前端如何處理emoji表情前端
- PHP中處理emoji表情PHP
- 【BUG記錄】MySQL插入Emoji表情報錯"Incorrect string value"MySql
- win10自帶字元表情如何使用_win10 emoji表情符號的使用教程Win10字元符號
- Laravel 專案實戰中如何快速整合 Emoji 表情包?Emoji 表情包太豐富了Laravel
- Laravel 使用阿里雲 oss 儲存物件Laravel阿里物件
- Windows10系統使用自帶Emoji表情的方法Windows
- 記阿里雲 RDS MySQL 的一個大坑阿里MySql
- Android Jetpack - Emoji表情符號初探AndroidJetpack符號
- 網站如何開啟Emoji 表情支援網站
- 如何從自建MySQL遷移至阿里雲RDS for MySQL的教程MySql阿里
- 相見恨晚的 MacBook 使用技巧「1」emoji表情賣萌Mac
- Mysql 儲存過程的使用MySql儲存過程
- iOS 11新Emoji表情偷跑:好歡樂iOS
- bili-emoji自定義表情包設定
- 雲資料庫RDS儲存能力進化解析!資料庫
- 如何遷移RDS中的加密儲存過程加密儲存過程
- 關於移動裝置 表情符號的資料庫儲存 與 utf8 與utf8mb4 字符集符號資料庫
- MySQL儲存MySql
- Emoji表情符號錄入MySQL資料庫報錯的解決方案符號MySql資料庫
- Laravel 中使用 MySQL 儲存過程LaravelMySql儲存過程