MySQL 修改字符集

前言

新建数据库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)

此时 中文正常入表。

结论:修改字符配置,对配置前的库/表依然不生效,对配置之后新创建的库、表生效,。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章