Home >Backend Development >PHP Tutorial >MySQL编码不一致,为什么还能显示中文?

MySQL编码不一致,为什么还能显示中文?

WBOY
WBOYOriginal
2016-06-06 20:32:581293browse

MySQL编码不一致,为什么还能显示中文?

1)不是应该用相同的编码才不会乱码的吗?
另外,数据库的编码是latin1不是不支持中文的吗?为什么我这里能显示中文?

2)还有一点不理解的是:我用set names utf8后,中文会乱码;
用set names gbk 后,中文能正常显示了,还是不太理解,为什么utf8不能显示中文?

3)我设置了set names gbk后,中文显示没有问题了。但关闭客户端再打开的时候,又必须再来一次set names gbk才能显示中文,怎么解决这个问题。

回复内容:

MySQL编码不一致,为什么还能显示中文?

1)不是应该用相同的编码才不会乱码的吗?
另外,数据库的编码是latin1不是不支持中文的吗?为什么我这里能显示中文?

2)还有一点不理解的是:我用set names utf8后,中文会乱码;
用set names gbk 后,中文能正常显示了,还是不太理解,为什么utf8不能显示中文?

3)我设置了set names gbk后,中文显示没有问题了。但关闭客户端再打开的时候,又必须再来一次set names gbk才能显示中文,怎么解决这个问题。

1、MySQL 的字符集支持有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

2、Db characterset: 你对这个理解好像有些偏差,这个是指当前数据库默认字符集, 请看下面例子。

<code>CREATE DATABASE `db_test1` CHARACTER SET 'utf8'  COLLATE 'utf8_general_ci';

use db_test1;

status;

Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8

----------------------------------------

CREATE DATABASE `db_test2` CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci';

use db_test2;

status;

Server characterset:    utf8
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
</code>

3、Server characterset 是指你创建数据库时如果不指定字符集时候使用的默认字符集。

4、Client characterset 是客户端连接到mysql所用的字符集,也就是说是使用这种字符集和数据库进行交互的。数据库最终存储的二进制,也就是说按照这个编码把当前输入的字符进行编码成对应的二进制。可以在登录mysql指定。

<code>mysql -uroot -p --default-character-set=latin1

或

set names latin1
</code>

现在已经指定字符集有好几种,服务器、客户端、数据库已经表等。 所以对于“对应编码相同就不会乱码”就需要重新理解一下,我的理解是:当客户端和数据库表所用的字符集一致就不会乱码。注意:服务器字符集可以使用utf-8、数据库字符集可以用GBK,而最终的表也可以为utf8。

<code>CREATE DATABASE `db_test1` CHARACTER SET 'utf8'  COLLATE 'utf8_general_ci';

use db_test1;

show create database db_test1;

+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| db_test1 | CREATE DATABASE `db_test1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+

create table test(name varchar(20)) default charset = latin1; 

show create table test;
+-------+------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                   |
+-------+------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------+

退出后重新连mysql

mysql db_test1 --default-character-set=latin1


status

Connection id:          299
Current database:       db_test1
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.6.23 MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1

insert into test values('中文测试');

select * from test;
+--------------+
| name         |
+--------------+
| 中文测试 |
+--------------+

可以看到这里没有看到乱码。当使用命令set names 修改客户端字符集的情况

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

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

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

mysql> select * from test;
+----------------+
| name           |
+----------------+
| ???????? |
+----------------+
1 row in set (0.00 sec)
</code>

因为 windows 下的 cmd 不支持 utf8 编码,所以使用 utf8 编码会乱码。

因为是在windows下,所以set names gbk显示正常
Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8
这样就不用每次set names gbk

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn