錯(cuò)誤描述:
使用的是Mysql數(shù)據(jù)庫们衙,在插入數(shù)據(jù)的時(shí)候報(bào)以下錯(cuò)誤:
Incorrect string value: '\xF0\x9F\x98\x81' for column 'declaration' at row 1
失敗場景
"活動(dòng)宣言" 字段中存在emoji表情,調(diào)用jdbc往mysql數(shù)據(jù)庫插入的時(shí)候拋出異常java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x81' for column 'declaration' at row 1
失敗原因
mysql的utf8編碼的一個(gè)字符最多3個(gè)字節(jié),但是一個(gè)emoji表情為4個(gè)字節(jié)祖凫,所以utf8不支持存儲(chǔ)emoji表情。但是utf8的超集utf8mb4一個(gè)字符最多能有4字節(jié)拨拓,所以能支持emoji表情的存儲(chǔ)苏遥。
解決方案
知道了原因,就好解決了彬犯,無非就是調(diào)整字符集向楼,支持存儲(chǔ)4個(gè)字節(jié);主要兩個(gè)方面谐区,一是將數(shù)據(jù)庫湖蜕、表、字段的字符集調(diào)整為utf8mb4字符集宋列,二是將Mysq的環(huán)境配置變量調(diào)整為utf8mb4字符集昭抒;
一. 修改database、table、column字符集
1灭返、修改database字符集
ALTER DATABASE 數(shù)據(jù)庫名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
2盗迟、修改table字符集
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
3、修改column字符集
ALTER TABLE 表名 CHANGE 字段名 字段名 該字段原來的數(shù)據(jù)類型 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
以上三種可以根據(jù)自己的實(shí)際情況來選擇修改婆殿;
二. 查看mysql配置變量
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
注意character_set_server這個(gè)變量的值是否等于utf8mb4,如果不是那么看第三步罩扇,進(jìn)行修改婆芦。
三. 修改MySQL配置文件
這邊mysql是安裝在centos下的,配置文件名稱為my.cnf,路徑按照自己安裝的目錄來喂饥。
vim /etc/my.cnf
找到character_set_server消约,將其值設(shè)置為 utf8mb4,保存退出员帮;然后重啟下mysql服務(wù)
進(jìn)入mysql的bin目錄:service mysqld restart
重新啟動(dòng)mysql后或粮,再次輸入表情,提交保存數(shù)據(jù)成功捞高。