1. 程式人生 > >mysql的utf8mb4編碼以及java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' 問題的處理

mysql的utf8mb4編碼以及java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' 問題的處理

最近在做一次資料轉移(postgresql轉移到mysql)的時候,發現會出現如下錯誤:

 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1  

這是字符集不支援的異常。
新舊資料庫都使用的是utf8編碼,utf8最大的一個特點,就是它是一種變長的編碼方式,它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度。其中Emoji表情和一些生僻字是4個位元組,而MySql的utf8編碼最多3個位元組,所以導致了資料插不進去報錯。
解決辦法是將資料庫的編碼從utf8修改為utf8mb4.

解決方法(mysql支援的最低版本為5.5.3)

1.docker啟動的mysql服務

docker啟動的服務就很簡單,只需要在run的時候在後面加入引數:–character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci ,就可以讓docker裡面的預設字元變成utf8mb4。

2.正常的mysql服務

1)版本檢查

mysql -v

2).更改配置檔案

修改mysql的配置檔案/etc/mysql/my.cnf, 新增如下內容:

[client]
default-character-set=utf8mb4

[mysql]
default
-character-set=utf8mb4 [mysqld] character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'

3)重啟資料庫

service mysql restart

4)檢查編碼格式

1.進入msyql

mysql -uroot -p

2.執行檢視編碼命令

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%'
OR Variable_name LIKE 'collation%';

5)java程式中的連線資料庫url中characterEncoding可以去掉,因為資料傳輸不用規定編碼了。

建議:我們資料儲存的大量資料不可避免的出現了表情以及生僻字等特殊字元,使用utf-8以及不能解決眼前的問題,所以強烈推薦mysql之後的編碼都是用utf8mb4