解決Springboot JPA + mysql 無法新增emoji問題
阿新 • • 發佈:2019-01-22
假設你資料庫用的是utf-8編碼,在沒有解決emoji編碼之前,會報類似以下錯誤:
Incorrect string value: '\xF0\x9F\x98\xAC' for column 'user_name'
其原因是因為utf8無法儲存emoji表情。在寫解決辦法之前先補充一下utf8mb4的概念:
什麼事utf8mb4?utf8mb4它是utf8的超集併兼容utf8的所有字符集,其中mb4表示most bytes
4,就是說字元編碼可以用1~4個位元組去編碼。
用utf8mb4的原因:
在mysql中utf8只支援字元長度最大為3個位元組的字元,而emoji是長度為4個位元組的字元,因此,普通的utf8編碼不能滿足emoji的要求,這時就需要用到utf8mb4編碼。(提示:utf8mb4要求mysql版本在5.5.3以上)
下面進入正題,如何解決題目中emoji問題:
第一步,修改對應欄位編碼,將其改為utf8mb4編碼
修改欄位編碼:ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 NULL DEFAULT NULL;
附上可能需要用到的其他操作:
修改資料庫編碼:SET character_set_database = utf8mb4; 或
alter database db_name character set utf8mb4
修改資料表編碼:ALTER TABLE db_name CHARACTER SET = utf8mb4;
檢視資料庫編碼:SHOW CREATE DATABASE db_name;
查看錶編碼:SHOW CREATE TABLE tb_name;
檢視欄位編碼:SHOW FULL COLUMNS FROM col_name;
完成了第一步,你就可以通過mysql手動插入emoji資料,但是通過Springboot插入資料還是會報錯,這時就需要下面這步:
第二步修改tomcat的sql插入編碼,修改yml檔案:
spring:
datasource:
driver-class-name: com.mysql.jdbc. Driver
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
username: root
password: '123456'
tomcat:
init-s-q-l: SET NAMES utf8mb4 //這是最重要的一步
完成上述兩步,就可以通過JPA插入emoji了,開森!