前言
新建数据库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)
此时 中文正常入表。
结论:修改字符配置,对配置前的库/表依然不生效,对配置之后新创建的库、表生效,。