mysql中emoji表情存儲


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
  • 請求的實例

解決方案

  1. android_id這個字段的編碼格式改為:utf8mb4,如在Navicat中修改:

  2. 修改mysql的配置

Windows下:在my.ini配置文件的[mysqld]下面添加:character_set_server=utf8mb4

  1. 重啟mysql服務

在服務中找到mysql,點擊重啟

以上三步操作后就可以愉快的存儲emoji表情啦。

小結

utf8與utf8mb4的區別:

  • UTF-8編碼中,一個英文字符占用一個字節的存儲空間,一個中文(含繁體)占用三個字節的存儲空間。
  • UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。因此可以用來存儲emoji表情。

拓展

  • 當同時對編碼類型為utf8validated字段 和utf8mb4android_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,應該就可以解決了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM