mysql set names 命令 和 彻底解决mysql 字符编码问题

1、执行show variables like '%char%';查看数据库字符集:

mysql>show variables like '%char%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)

2、执行set names utf8;

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

3、再次查看字符集:

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       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.01 sec)

结论:set names xxx命令是一次性统一修改character_set_client、character_set_connection和character_set_results的字符集。它们都是和 client 相关的。而 真正server端的编码字符集,character_set_server 和 character_set_database ,set names 'xxx' 根本无法修改。set names 'xxx' 命令可以使 character_set_client、character_set_connection、character_set_results 三者统一。client (character_set_client) -----> character_set_connection -------> mysqld  ------> client(character_set_results)减少编码转换的需要。

4、下面说下各个字符集的作用:

1)character_set_system:

character_set_system 是系统元数据(字段名等)存储时使用的编码字符集,该字段和具体存储的数据无关。总是固定不变的——utf8. 我们可以不去管它。

2)character_set_server:

该变量设置的 server 级别的(mysqld级别的) 字符集。也就是说设置的是 一个 mysqld 的字符集,这个是所有字符最后存储时使用的编码字符集,默认值为 lantin1. 我们一般设置成:utf8、utf8mb4、gbk 等值。

3)character_set_database:

character_set_database 是单个数据库级别的字符集设置,该参数允许我们在同一个 mysqd 下面的不同的 database 使用不同的字符集。

如果创建数据库时没有指定字符集,那么他们会默认使用:character_set_server 和 character_collation 的值作为默认值。

4)character_set_client:

mysql client 发送 给 mysqld 的语句使用的 编码字符集。可以使用 --default-character-set 参数来显示设置。

5)character_set_connection:

客户机和服务器连接的字符集

6)character_set_results:

mysqld 在返回 查询 结果集 或者错误信息到 client 时,使用的编码字符集。

7)character_set_filesystem:

把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认是binary,表示不做任何转换

5、character_set_server 和 character_set_database 

二者 的作用其实是相同的,都是设置 字符最终存储到磁盘时,使用的编码字符集。只不过 二者设置的级别不一样而已。character_set_server 设置了 mysqld 级别的存储编码字符集,而character_set_database设置 mysqld 中单个 database 的存储编码字符集。而且character_set_database的默认值就是 character_set_server 的值。

存在三次编码转换过程:

1)mysql client 使用 character_set_client编码的字符------> character_set_connection 编码字符

    ------> mysqld :这里需要从 character_set_connection 编码格式二进制流解码成 字符,然后使用 character_set_server/character_set_database 对字符进行再次编码,生成二进制流,存储时,就是存储再次编码的二进制流数据。

2)读取数据时,会使用 character_set_server/character_set_database 对读取到的二级制流进行 解码成 字符,然后使用 character_set_results 对字符进行二次编码,生成二进制流,发给 mysql client.

所以 使用 set names 'xxx' 命令,结合 character_set_server 参数,可以将 整个过程的 字符集设置成相同的,就不会存在编码转换的过程。

6、修改字符集编码:

set character_set_server=utf8;
set character_set_database=utf8;

 

7、mysqld:

mysqld:SQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。

8、默认情况下字符集选择规则:

(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,可以在配置文件 (my.cnf) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时character_set_server被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

9、为表指定字符集有以下几种方式:

default character set=utf8;
default char set=utf8;
default charset=utf8;
character set=utf8;
char set=utf8;
charset=utf8;
使用show create table table_name;命令查看表的字符集

10为数据库指定字符集:

创建的每个数据库都有一个默认字符集,如果没有指定,就用latin1。

default character set=utf8;
default character set utf8;
default char set=utf8;
default char set utf8;
default charset=utf8;
default charset utf8;
character set=utf8;
character set utf8;
char set=utf8;
char set utf8;
charset=utf8;
charset utf8;
使用show create database db_name;命令查看数据库字符集

11、彻底修改字符集:

1)会话(session)范围修改:

set character_set_server=utf8;
set character_set_database=utf8;

字符集已经修改成都是utf8了。但是这里有一个问题,那就是我们重新打开一个命令窗口然后查看数据编码,又变成修改之前的样子了

2)global范围修改

mysql设置变量的范围默认是session范围。如果设置多个会话的字符集那么需要设置global范围

set global character_set_database=utf8;
set global character_set_server=utf8;

当我们数据库重启的时候,会发现设置global范围的值又变成修改之前的样子了;

3)彻底修改字符集:

修改mysql配置文件:

windows:my.ini,位置:安装版的在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

mysql set names 命令 和 彻底解决mysql 字符编码问题_第1张图片

linux:my.cnf,位置:/etc/my.cnf

[mysqld]
character-set-server=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

请注意这几个参数配置的位置,不然可能会启动不起来mysql服务:

mysql set names 命令 和 彻底解决mysql 字符编码问题_第2张图片

OK。这下如果重启mysql服务也会发现它的字符集是修改后的了。

mysql set names 命令 和 彻底解决mysql 字符编码问题_第3张图片

而且我们创建表的时候不需要指定字符编码,它默认就是utf8;

drop database test;
create database test;
use test;
create table user(name varchar(11));
show create table user;

 

你可能感兴趣的:(Mysql)