MySQL set names 命令_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

11bbc8081761e8bbb0e1a7754d8a6c35.png

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

[mysqld]

character-set-server=utf8

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

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

5baa310d3ca9780bff157026ad66bf18.png

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

fa47f34ef0825800c08df9354606f54d.png

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

drop database test;

create database test;

use test;

create table user(name varchar(11));

show create table user;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值