前言
新建數據庫test1並在其中創建表
mysql> create table if not exists user(
-> id int(11) not null,
-> name varchar(16) not null
-> );
並向其中插入兩條數據
mysql> insert into user values(1,'zs');
Query OK, 1 row affected (0.02 sec)
mysql> insert into user values(1,'張三');
ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1
發現當插入內容爲中文時報錯了。
查看user表的定義:
mysql> show create table user\G;
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
建表時並未指定字符集,現在可以看到user表使用的默認字符集是latin1(拉丁)。應該是字符集的問題導致了中文亂碼
查看字符集
show variables like ‘character%’;
或者
show variables like ‘character%’;
查詢結果如下:
mysql> show variables like '%char%';
+--------------------------+-----------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.7.27-macos10.14-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+
默認客戶單和服務器端都使用了latin1(拉丁),所以會出現中文亂碼。
/etc/my.cnf(默認mysql配置文件位置)下新增配置
[client]
default-character-set = utf8
[mysqlId]
character_set_server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
配置完畢,重啓mysql。
systemctl start mysqld.service
重新回到數據庫test1,往user表中新增數據,發現仍報編碼問題
mysql> use test1;
Database changed
mysql> insert into user values(2,'李四');
ERROR 1366 (HY000): Incorrect string value: '\xE6\x9D\x8E\xE5\x9B\x9B' for column 'name' at row 1
既然修改配置之前創建的表不生效,那麼新建一張表試試
CREATE TABLE `people` (
`id` int(11) NOT NULL,
`name` varchar(16) NOT NULL
);
//插入數據
mysql> insert into people values(1,'哈哈');
ERROR 1366 (HY000): Incorrect string value: '\xE5\x93\x88\xE5\x93\x88' for column 'name' at row 1
發現仍是不生效的。
查看此時test1庫下的字符集
mysql> show variables like '%char%';
+--------------------------------------+----------------------------+
| Variable_name | Value |
+--------------------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1 |
+--------------------------------------+----------------------------+
發現數據庫的字符集character_set_database
仍是latin1。
重新創建庫,創建表
ysql> create database test2;
Query OK, 1 row affected (0.00 sec)
mysql> use test2;
Database changed
mysql> show variables like '%char%';
+--------------------------------------+----------------------------+
| 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/ |
| validate_password_special_char_count | 1 |
+--------------------------------------+----------------------------+
9 rows in set (0.00 sec)
mysql> create table user( id int(11) not null , name varchar(16) not null);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into user values(1,'張三');
Query OK, 1 row affected (0.01 sec)
mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 1 | 張三 |
+----+--------+
1 row in set (0.00 sec)
此時 中文正常入表。
結論:修改字符配置,對配置前的庫/表依然不生效,對配置之後新創建的庫、表生效,。