MySQL字符集在Linux下与在Windows下的不同

2 篇文章 0 订阅
今天在学习MySQL字符集知识的时候,发现在Linux操作系统下字符集的显示与在Windows操作系统下不太一样,此话怎么讲,请听我细细道来,也就是说在Linux下创建的gbk和utf8类型的表,没有显式的指定字符类型直接插入中文后,默认是使用character_set_connection变量指定的类型的字符插入到表中(通常该变量的值建议设置为utf8,如果character_set_client变量与character_set_connection变量的值不同,字符集会发生转换),在Windows下mysql客户端需要设置成gbk字符集才可以正常显示,而在Windows下没有显式的指定字符类型直接插入中文后,默认是使用gbk类型的字符插入到表中,而在Linux下设置成utf8才可以正常显示。

请看下面的实例操作:
一、下面是在Linux操作系统所做的操作:
Linux操作系统环境:RHEL6.5 64bit
[root@wlkp ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.5 (Santiago)
MySQL环境:5.6.24
[root@wlkp ~]# /home/hff/mysql5624/bin/mysqld --version
/home/hff/mysql5624/bin/mysqld  Ver 5.6.24 for Linux on x86_64 (Source distribution)
[root@wlkp ~]# /home/hff/mysql5624/bin/mysql --version 
/home/hff/mysql5624/bin/mysql  Ver 14.14 Distrib 5.6.24, for Linux (x86_64) using  EditLine wrapper
[root@wlkp mysql5624]# bin/mysql -S /home/hff/mysql5624/mysqld.sock                                         
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.24 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

查看当前MySQL服务器的字符集设置:
mysql> show variables like 'character_set\_%';
+--------------------------+--------+
| 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   |
+--------------------------+--------+
7 rows in set (0.00 sec)

mysql> use test;
Database changed

创建t_gbk表,表字符集与列字符集都是gbk的:
mysql> create table t_gbk(name varchar(20) charset gbk) charset gbk;
Query OK, 0 rows affected (0.17 sec)

创建t_utf8表,表字符集与列字符集都是utf8的:
mysql> create table t_utf8(name varchar(20) charset utf8) charset utf8;
Query OK, 0 rows affected (0.21 sec)

向两个表中插入中文记录:
mysql> insert into t_gbk values('1中文');
Query OK, 1 row affected (0.02 sec)

mysql> insert into t_utf8 values('1中文');   
Query OK, 1 row affected (0.02 sec)

查看表数据,中文都可以正常显示:
mysql> select * from t_gbk;
+--------+
| name   |
+--------+
| 1中文  |
+--------+
1 row in set (0.00 sec)

mysql> select * from t_utf8;
+--------+
| name   |
+--------+
| 1中文  |
+--------+
1 row in set (0.00 sec)

设置字符集相关变量为gbk:
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | gbk    |
| character_set_connection | gbk    |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | gbk    |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

然后显示两个表的中文数据,发现不能正常显示了:按说t_gbk表的数据应该可以正常显示啊,现在这里不能正常显示,所以我理解的是由于之前character_set_client和character_set_connection变量为utf8,导致插入到表中的中文字符都按照utf8的编码格式进行的存储,所以t_gbk也不能正常显示中文

mysql> select * from t_gbk;
+------+
| name |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

mysql> select * from t_utf8;
+------+
| name |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

重新设置成utf8后可以正常显示:
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_gbk;
+--------+
| name   |
+--------+
| 1中文  |
+--------+
1 row in set (0.00 sec)

mysql> select * from t_utf8;
+--------+
| name   |
+--------+
| 1中文  |
+--------+
1 row in set (0.00 sec)

设置字符集相关变量为gbk:
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

向t_gbk插入数据成功:
mysql> insert into t_gbk values('2中文');                                                                    
Query OK, 1 row affected (0.02 sec)

然而,向t_utf8插入数据发现是失败的:按说t_utf8表也是支持中文的,而现在不能正常插入,所以我理解的是由于character_set_client和character_set_connection设置为了gbk,导致插入到表中的中文字符都按照gbk的编码格式进行的存储,而t_utf8不能识别这种编码格式,所以报错

mysql> insert into t_utf8 values('2中文');   
ERROR 1366 (HY000): Incorrect string value: '\xAD\xE6\x96\x87' for column 'name' at row 1

我们再来显示一下表的值,发现在gbk下,“2中文”这条记录正常显示了,但是1记录不正常:
mysql> select name,length(name) from t_gbk;
+---------+--------------+
| name    | length(name) |
+---------+--------------+
| 1       |            5 |
| 2中文   |            7 |
+---------+--------------+
2 rows in set (0.00 sec)

mysql> select name,length(name) from t_utf8;
+-------+--------------+
| name  | length(name) |
+-------+--------------+
| 1     |            7 |
+-------+--------------+
1 row in set (0.00 sec)

二、下面是在Windows操作系统所做的操作:
在打开一个mysql客户端:

设置成gbk字符集(默认就是):
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

记录正常显示中文:
mysql> select * from t_gbk;
+---------+
| name    |
+---------+
| 1中文   |
| 2中文   |
+---------+
3 rows in set (0.00 sec)

mysql> select * from t_utf8;
+-------+
| name  |
+-------+
| 1中文 |
| 2中文 |
+-------+
2 rows in set (0.00 sec)

而设置成utf8字符集:
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

记录中文不正常显示:
mysql> select * from t_gbk;
+----------+
| name     |
+----------+
| 1涓?枃  |
| 2涓?枃  |
+----------+
3 rows in set (0.00 sec)

mysql> select * from t_utf8;
+---------+
| name    |
+---------+
| 1涓?枃 |
| 2涓?枃 |
+---------+
2 rows in set (0.00 sec)

结论:所以在Linux操作系统下,还是建议使用utf8这种字符集来支持中文,通用性强,如果使用gbk字符集类型的表,在windows下有可能不会正常显示中文。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值