字符集是一套符号和编码,校验规则是字符集内用来比较字符的一些规则,也就是字符集的排序规则。MySQL可以使用多种字符集和检验规则来组织字符。
MySQL服务器支持多种字符集,在同一台服务器、同一个数据库甚至是同一个表的不同字段都可以使用不同的字符集。
每种字符集都可能有多种校验规则,并且都有一个默认的校验规则。每个校验规则只针对某个字符集,与其他字符集没有关系。
在MySQL中,字符集的概念和编码方案被看作同义词,一个字符集是一个转换表和一个编码方案的组合。
我们怎么查看我们的数据库支持的字符集呢?
show character set;
查看字符集的校验规则:
show collation;
然后就会哒哒哒地出一堆东西出来,就是你服务器支持的字符集校验规则了。
怎么查看当前数据库的字符集呢?输下面这个命令就好了
show variables like 'character%'\G
然后就会弹出下面这样一堆东西(具体的字符集可能和我这的不一样)
*************************** 1. row ***************************
Variable_name: character_set_client
Value: gbk
*************************** 2. row ***************************
Variable_name: character_set_connection
Value: gbk
*************************** 3. row ***************************
Variable_name: character_set_database
Value: utf8
*************************** 4. row ***************************
Variable_name: character_set_filesystem
Value: binary
*************************** 5. row ***************************
Variable_name: character_set_results
Value: gbk
*************************** 6. row ***************************
Variable_name: character_set_server
Value: utf8mb4
*************************** 7. row ***************************
Variable_name: character_set_system
Value: utf8
*************************** 8. row ***************************
Variable_name: character_sets_dir
Value: E:\programFiles\mysql-8.0.21-winx64\share\charsets\
8 rows in set, 1 warning (0.01 sec)
来解释一下这些variable_name的意思
character_set_client:客户端请求数据的字符集
character_set_connection:客户机/服务器连接的字符集
character_set_database:默认数据库的字符集。无论默认数据库如何改变,都是这个字符集;如果没有默认字符集,那就使用character_set_server指定的字符集。这个变量最好不要人为定义。
character_set_filesystem: 把os上的文件名转化成此字符集。也就是说,把character_set_client转换为character_set_filesystem,默认的binary不做任何转换。
character_set_results:结果集,返回给客户端的字符集
character_set_server:数据库服务器的默认字符集
character_set_system: 系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。
怎么查看当前数据库的校验规则呢?
show variables like 'collation%'\G
然后就会返回当前数据库的校验规则
*************************** 1. row ***************************
Variable_name: collation_connection
Value: gbk_chinese_ci
*************************** 2. row ***************************
Variable_name: collation_database
Value: utf8_general_ci
*************************** 3. row ***************************
Variable_name: collation_server
Value: utf8mb4_0900_ai_ci
3 rows in set, 1 warning (0.00 sec)
为数据库指定字符集
在创建数据库的时候,如果不指定字符集,那么默认的字符集就是latin1
我们可以在创建数据库的时候,指定字符集:
create database lyxt charset=utf8;
当然,也可以修改已经创建好的数据库的字符集
alter database dbname character set utf8;
为数据库指定校验规则
在创建数据库的时候指定校验规则:
create database lyxt default charset utf8 collate utf8_romanian_ci;
修改已经存在的数据库的校验规则:
alter database lyxt collate utf8_romanian_ci;
在创建数据表的时候,为数据表分配字符集
create table table_charset(
-> c1 varchar(10),
-> c2 varchar(10)
-> )engine=innodb default charset=utf8;
为表指定校验规则
create table table_collate(
-> c1 varchar(10),
-> c2 varchar(10)
-> )engine=innodb default charset utf8 collate utf8_romanian_ci;
为列分配字符集
create table column_charset(
-> c1 char(10) character set utf8 not null,
-> c2 char(10) char set utf8,
-> c3 varchar(10) charset utf8,
-> c4 varchar(10)
-> )engine=innodb;
为列分配校验规则
create table column_collate(
-> c1 varchar(10) charset utf8 collate utf8_romanian_ci not null,
-> c2 varchar(10) charset utf8 collate utf8_spanish_ci
-> )engine=innodb;