mysql中emoji表情存儲
背景
在mysql 5.7.19,創建的數據庫默認選擇的編碼是
utf8 -- UTF-8 Unicode
,因此字段默認的編碼為utf-8
,但在項目開發中存在一個需求:在某個字段中存儲混有emoji表情的字符串,此時以普通編碼格式如utf8
來存儲emoji表情時,會報
org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement
...
Caused by: org.hibernate.exception.GenericJDBCException: could not execute statement
...
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x95\xE2\x80...' for column 'android_id' at row 1
- 請求的實例
解決方案
-
把
android_id
這個字段的編碼格式改為:utf8mb4
,如在Navicat中修改:
-
修改mysql的配置
Windows下:在my.ini配置文件的
[mysqld]
下面添加:character_set_server=utf8mb4
- 重啟mysql服務
在服務中找到mysql,點擊重啟
以上三步操作后就可以愉快的存儲emoji表情啦。
小結
utf8與utf8mb4的區別:
- UTF-8編碼中,一個英文字符占用一個字節的存儲空間,一個中文(含繁體)占用三個字節的存儲空間。
- UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。因此可以用來存儲emoji表情。
拓展
- 當同時對編碼類型為
utf8
的validated
字段 和utf8mb4
的android_id
字段聯合查詢時
在spring data jpa中查詢會報該異常
List<Toilet> findByAndroidIdAndValidated(String androidId, boolean flag);
異常如下
Caused by: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
而在Navicat中使用sql查詢並不會報錯
SELECT * FROM `toilet` where android_id = 'Miss.龍💕' and validated = 1;
此時在my.ini配置文件的[mysqld]
下面添加:character_set_server=utf8mb4
,重啟mysql,應該就可以解決了。