「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
最近碰到了数据库表字段的字符集问题,顺便整体学习一下MySQL如何查看、设置和修改字符集。
1. 查看字符集
1.1 字符集支持
对于MySQL中支持的所有字符集类型,可以使用show charset;命令进行查看,命令返回所有支持字符集的信息.
1.2 Character和Collation
在MySQL中,对字符集的支持主要表现在两个方面: 字符集(Character set)和排序方式(Collation),可以通过在MySQl中使用查询语句来查看对应的字符集信息:
# 查看当前MySQL服务器和数据库的字符集
show variables like '%character%';
# 查看MySQL排序方式
show variables like '%collation%';
执行后可以得到结果显示:
MySQL对于字符集的支持可以具体细化到四个层次: 服务器server,数据库database,数据表table和连接connection,使用collection进行模糊查询时返回结果中包含了MySQl在服务、数据库、连接上的字符集。
1.3 数据表和字段的字符集
知道了MySQL中服务、数据库、连接的字符集后,还可以进一步查看数据库中每一张数据表、以及数据表中每个数据字段对应的字符集
# 查看指定数据库中指定表使用的字符集,可以使用模糊查询返回多个表的状态,
show table status from databaseName like 'tableName%';
# 查看表中所有类的字符集信息,返回每列的信息
show full columns from cust_customer;
查询时,结果数据中Collation列表示字符集信息
查询数据表所有字段的状态时,结果中有显示每个字段使用的字符集
2. MySQL默认字符集
MySQL对于字符集的指定可以细化到一个数据库、一张数据表甚至是一个数据字段, 但是在实际数据库的创建过程中却并没有进行相关字符集的配置,这是因为MySQL中存在一个由上而下的字符集继承机制。
MySQL默认字符集的继承机制可以描述为以下流程:
- MySQL程序中指定了一个默认的latin1字符集,
- 下载安装MySQL程序时,可以在MySQL的配置文件
my.ini中指定默认的字符集;如果不进行配置则会继承程序指定的latin1字符集, - 启动mysql时,可以使用命令指定需要使用的字符集;如果不进行指定会继承自配置文件中的字符集配置,启动后character_set_server被赋值为默认latin1字符集,
- 在mysql中新增数据库时可以指定使用字符集;如果不指定则被设定为character_set_server的字符集,
- 选择数据库时,character_set_database代表当前数据库的字符集,在数据库里创建表时的如果不指定字符集会使用character_set_database对应字符集,
- 在表中增加字段时,默认使用当前表的字符集。
3. 设置字符集
了解MySQL字符集的使用机制之后,并且可以使用命令查看当前数据库的字符集信息,就可以将字符集设置为需要的类型了。
3.1 创建数据库/表时指定字符集
在MySQl字符集继承流程中说到,在创建数据库和数据表时可以明确指定使用的字符集。
# 创建数据库时指定字符集
create database 库名 default character set[=]字符集;
#创建数据表的时候指定字符集
create table 表名(属性) default character set[=]字符集;
3.2 修改MySQL系统字符集
对于MySQL系统相关字符集,可以使用配置my.ini文件的方式修改默认字符集,也可以使用命令的方式单独设置对应的字符集信息。
# character,建立连接使用的编码
set character_set_connection=utf8;
# 数据库服务器的编码,默认的内部操作字符集
set character_set_server=utf8;
# 系统元字符集(字段名等)
set character_set_system=utf8;
# 客户端来源数据使用字符集
set character_set_client=utf8;
# 结果集的字符集编码
set character_set_results=utf8;
# 数据库的编码,即当前选中数据库的默认字符集
set character_set_database=utf8;
# collation,用来描述字符序
set collation_connection=utf8;
set collation_database=utf8;
set collation_server=utf8;
3.3 修改数据库、表和字段的字符集
对于已经存在的数据库、表和字段,如果字符集类型不合适,可以使用sql语句修改使用字符集。
# 修改数据库的字符集
alter database databaseName default character set 字符集;
# 修改数据表的字符集
alter table tableName convert to character set 字符集;
# 修改指定表中的字段,并设置新的字符集,不可以和修改备注同时使用
ALTER table test modify name varchar(20) character set utf8;