当前位置:Gxlcms > 数据库问题 > 了解MySQL的字符集

了解MySQL的字符集

时间:2021-07-01 10:21:17 帮助过:2人阅读

六、关于中文字符集插入的实验

字符集不一致是导致数据库内中文内容乱码的罪魁祸首。

实验环境:

Server version: 5.6.28 (在此说明实验环境是由于在学习过程中,从网上参考了部分资料,实验过程与资料描述稍有出入,未查出原因,只能暂归结为版本不同所致。)

实验对象:

mysql> show create table char_test\G 
*************************** 1. row ***************************
       Table: char_test
Create Table: CREATE TABLE `char_test` (
  `id` smallint(6) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

由上可知,char_test表的字符集是latin1,如果不设置正确的字符集,插入中文字符时,必然会出现如下错误:

mysql> insert into char_test (name) values (‘小王‘);
ERROR 1366 (HY000): Incorrect string value: ‘\xE5\xB0\x8F\xE7\x8E\x8B‘ for column ‘name‘ at row 1

 

解决方案

(1)、先set names latin1,然后再插入数据。

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into char_test (name) values (‘小王‘);
Query OK, 1 row affected (0.01 sec)

mysql> select * from char_test;
+----+--------+
| id | name   |
+----+--------+
|  1 | Tom    |
|  2 | 小明   |
|  3 | 小王   |
+----+--------+
3 rows in set (0.00 sec)

(2)、在data.sql文件中指定set names latin1,然后通过source命令导入data.sql。

# vi data.sql
set names latin1;
insert into char_test (name) values (‘小李‘);

mysql> source data.sql
Query OK, 1 row affected (0.00 sec)

mysql> select * from char_test;
+----+--------+
| id | name   |
+----+--------+
|  1 | Tom    |
|  2 | 小明   |
|  3 | 小王   |
|  4 | 小李   |
+----+--------+
4 rows in set (0.00 sec)

(3)、在data.sql文件中指定set names latin1,然后通过mysql命令导入

# vi data.sql
set names latin1;
insert into char_test (name) values (‘小张‘);

# mysql -uroot -p test1 < data.sql
# mysql -uroot -p -e "set names latin1;select * from test1.char_test;"

(4)、通过指定mysql命令的字符集参数实现 --default-charset-set=字符集

# vi data.sql
insert into char_test (name) values (‘小张‘);

# 错误方法
# mysql -uroot -p  test1 < data.sql                      
Enter password: ******
ERROR 1366 (HY000) at line 1: Incorrect string value: ‘\xE5\xB0\x8F\xE8\xB5\xB5‘ for column ‘name‘ at row 1

# 正确方法
# mysql -uroot -p  --default-character-set=latin1 test1 < data.sql 
Enter password: ******

# mysql -uroot -p -e "set names latin1;select * from test1.char_test;"
Enter password: ******
+----+--------+
| id | name   |
+----+--------+
|  1 | Tom    |
|  2 | 小明   |
|  3 | 小王   |
|  4 | 小李   |
|  5 | 小张   |
|  6 | 小赵   |
+----+--------+

(5)、在配置文件中指定客户端的字符集

vi my.cnf
[client]
default-character-set=latin1

mysql> insert into char_test (name) values (‘小马‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from char_test;
+----+--------+
| id | name   |
+----+--------+
|  1 | Tom    |
|  2 | 小明   |
|  3 | 小王   |
|  4 | 小李   |
|  5 | 小张   |
|  6 | 小赵   |
|  7 | 小马   |
+----+--------+
7 rows in set (0.00 sec)

 

了解MySQL的字符集

标签:

人气教程排行