天天看點

Spring Boot Data JPA support Emoji

最近項目中出現一個問題,MySQL插入帶有表情的資料會報錯,以往的處理方式都是改一下資料庫編碼為utf8mb4就行了,但是這次怎麼試怎麼試都不行,以往用的持久層架構是mybatis,也不知道是不是和架構有關,現在用的是SpringDataJPA ,自己去查了資料,用以下這種方式可以解決問題。

在項目中使用到Emoji表情儲存(MySQL),出現異常,解決方法分為兩個部分:

一. 服務端:

資料庫/表/字段均采用UTF8編碼,MySQL的說法為:

  • The utf8 Character Set (3-Byte UTF-8 Unicode Encoding)
  • The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

UTF8為3個位元組,為4個位元組,而Emoji為4個位元組,是以在插入時會出現異常:

INSERT INTO ${table} (${field}) VALUES ('What a nice emoji?!');

Incorrect string value: '\xF0\x9F\x98\x80!' for column '${field}' at row 1
           

修改表/字段的編碼為UTF8MB4:

ALTER TABLE `${table}` CHARACTER SET = utf8mb4;
ALTER TABLE `${table}` CHANGE `${field}` `${field}` VARCHAR(1200)  CHARACTER SET utf8mb4  NULL  DEFAULT NULL;
           

測試插入:

INSERT INTO ${table} (${field}) VALUES ('Now you are ready to handle emoji ?');

select ${field} from ${table}

+--------------------------------------+
| Level                                |
+--------------------------------------+
| Now you are ready to handle emoji ? |
+--------------------------------------+
           
二. 用戶端:

添加如下配置(配置的key根據使用的連接配接池來确定):

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/base-architecture?useUnicode=true&characterEncoding=utf8
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      connection-init-sql: SET NAMES utf8mb4
           

繼續閱讀