問題描述
在向 MySQL 數(shù)據(jù)庫中插入 utf-8 編碼格式的中文字符時,由于數(shù)據(jù)庫的字符編碼為 latin1 的原因衔憨,就會出現(xiàn)如下異常
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x9C' for column 'content' at row 1.
此時叶圃,說明由于編碼不一致的問題,導致該字段無法正確插入中文字符
解決思路
將數(shù)據(jù)庫的編碼轉換為 utf-8践图,并修改已有數(shù)據(jù)表以及數(shù)據(jù)字段的字符編碼掺冠,以確保中文字符能夠正確插入
解決方法
一、定位 my.cnf 文件配置
find / -name my.*
/etc/my.cnf.d
/etc/my.cnf
/etc/my.cnf.rpmsave
二码党、修改 my.cnf 文件內(nèi)容德崭,添加配置其默認編碼格式
vim /etc/my.cnf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
三、重啟 mysql 服務
systemctl restart mysqld
四揖盘、查看當前數(shù)據(jù)庫系統(tǒng)變量是否為 utf8 格式
show variables like '%character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
此時新建的數(shù)據(jù)庫會默認采用 utf8 的格式
五接癌、查看已有數(shù)據(jù)表的編碼格式
show create table black_list;
+------------+-------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+-------------------------------------------------------------------------------------------------------------------------------+
| black_list | CREATE TABLE `black_list` (
`user_id` varchar(20) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------+-------------------------------------------------------------------------------------------------------------------------------+
此時可以看到,對于已經(jīng)存在的數(shù)據(jù)表扣讼,其編碼格式仍為 latin1,因此需要手動更改其編碼格式為 utf8
六缨叫、更改數(shù)據(jù)表的編碼格式為 utf8
alter table black_list default character set utf8;
此時再次查看數(shù)據(jù)表編碼格式時發(fā)現(xiàn)椭符,雖然其表的編碼格式變?yōu)?utf8,但是字段列仍為 latin1 編碼格式耻姥,因此销钝,還需要手動將每個需要更改的字段的編碼格式進行修改
+------------+-------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+-------------------------------------------------------------------------------------------------------------------------------+
| black_list | CREATE TABLE `black_list` (
`user_id` varchar(20) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------+-------------------------------------------------------------------------------------------------------------------------------+
七、更改字段列的編碼格式為 utf8
alter table black_list modify column user_id varchar(20) CHARACTER SET utf8 NOT NULL;
此時就可以順利插入 utf-8 格式的中文字符了