阿里雲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 04-EMOJI 表情與 UTF8MB4 的故事MySql
- MySQL 資料庫儲存 Emoji 表情及特殊符號MySql資料庫符號
- emoji等表情符號存mysql的方法符號MySql
- Mysql伺服器無法存emoji表情的解決方案MySql伺服器
- Laravel 使用阿里雲 oss 儲存物件Laravel阿里物件
- 記阿里雲 RDS MySQL 的一個大坑阿里MySql
- MYSQL資料庫與Emoji表情的故事MySql資料庫
- Emoji 編碼
- 如何從自建MySQL遷移至阿里雲RDS for MySQL的教程MySql阿里
- 雲資料庫RDS儲存能力進化解析!資料庫
- 阿里雲mysql原始碼編譯安裝阿里MySql原始碼編譯
- 容器化RDS—— 計算儲存分離 or 本地儲存
- 【BUG記錄】MySQL插入Emoji表情報錯"Incorrect string value"MySql
- 前端如何處理emoji表情前端
- SpringBoot使用阿里OSS實現檔案雲端儲存Spring Boot阿里
- 自建Kubernetes叢集如何使用阿里雲CSI儲存元件阿里元件
- 阿里雲OSS雲端儲存管理實踐阿里
- 阿里雲 Mysql RDS 在 私有環境的恢復測試。阿里MySql
- 阿里雲RDS PG最佳實踐阿里
- 阿里雲RDS 管理介面的bug阿里
- Android Jetpack - Emoji表情符號初探AndroidJetpack符號
- win10自帶字元表情如何使用_win10 emoji表情符號的使用教程Win10字元符號
- 雲原生儲存編排器Rook
- Laravel 專案實戰中如何快速整合 Emoji 表情包?Emoji 表情包太豐富了Laravel
- 阿里雲 Redis 混合儲存版上線阿里Redis
- 阿里雲 RDS MongoDB4.0新建庫,表,使用者和密碼步驟阿里MongoDB密碼
- Serverless 使用阿里雲OOS將http檔案轉存到物件儲存Server阿里HTTP物件
- Mysql 儲存過程的使用MySql儲存過程
- PHPMyAdmin 設定阿里雲rds訪問PHP阿里
- 網站如何開啟Emoji 表情支援網站
- 阿里雲物件儲存OSS支援版本管理特性阿里物件
- 相見恨晚的 MacBook 使用技巧「1」emoji表情賣萌Mac
- 自建MySQL於阿里雲資料庫檔案儲存DBFS之上的優勢MySql阿里資料庫
- MySQL儲存MySql
- Laravel 中使用 MySQL 儲存過程LaravelMySql儲存過程
- Python自定義阿里雲RDS備份策略Python阿里