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)
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,表示不做任何转换
二者 的作用其实是相同的,都是设置 字符最终存储到磁盘时,使用的编码字符集。只不过 二者设置的级别不一样而已。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 参数,可以将 整个过程的 字符集设置成相同的,就不会存在编码转换的过程。
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;命令查看数据库字符集
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
linux:my.cnf,位置:/etc/my.cnf
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
请注意这几个参数配置的位置,不然可能会启动不起来mysql服务:
OK。这下如果重启mysql服务也会发现它的字符集是修改后的了。
而且我们创建表的时候不需要指定字符编码,它默认就是utf8;
drop database test;
create database test;
use test;
create table user(name varchar(11));
show create table user;