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)

此時 中文正常入表。

結論:修改字符配置,對配置前的庫/表依然不生效,對配置之後新創建的庫、表生效,。

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