MySQL数据表字符集

2022-10-31 09:48:25 浏览数 (1)

字符集是一套符号和编码,校验规则是字符集内用来比较字符的一些规则,也就是字符集的排序规则。MySQL可以使用多种字符集和检验规则来组织字符。

MySQL服务器支持多种字符集,在同一台服务器、同一个数据库甚至是同一个表的不同字段都可以使用不同的字符集。

每种字符集都可能有多种校验规则,并且都有一个默认的校验规则。每个校验规则只针对某个字符集,与其他字符集没有关系。

在MySQL中,字符集的概念和编码方案被看作同义词,一个字符集是一个转换表和一个编码方案的组合。

我们怎么查看我们的数据库支持的字符集呢?

代码语言:javascript复制
show character set;

查看字符集的校验规则:

代码语言:javascript复制
show collation;

然后就会哒哒哒地出一堆东西出来,就是你服务器支持的字符集校验规则了。

怎么查看当前数据库的字符集呢?输下面这个命令就好了

代码语言:javascript复制
show variables like 'character%'G

然后就会弹出下面这样一堆东西(具体的字符集可能和我这的不一样)

代码语言:javascript复制
*************************** 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:programFilesmysql-8.0.21-winx64sharecharsets
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,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。

怎么查看当前数据库的校验规则呢?

代码语言:javascript复制
show variables like 'collation%'G

然后就会返回当前数据库的校验规则

代码语言:javascript复制
*************************** 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

我们可以在创建数据库的时候,指定字符集:

代码语言:javascript复制
 create database lyxt charset=utf8;

当然,也可以修改已经创建好的数据库的字符集

代码语言:javascript复制
alter database dbname character set utf8;

为数据库指定校验规则

在创建数据库的时候指定校验规则:

代码语言:javascript复制
create database lyxt default charset utf8 collate utf8_romanian_ci;

修改已经存在的数据库的校验规则:

代码语言:javascript复制
alter database lyxt collate utf8_romanian_ci;

在创建数据表的时候,为数据表分配字符集

代码语言:javascript复制
create table table_charset(
    -> c1 varchar(10),
    -> c2 varchar(10)
    -> )engine=innodb default charset=utf8;

为表指定校验规则

代码语言:javascript复制
 create table table_collate(
    -> c1 varchar(10),
    -> c2 varchar(10)
    -> )engine=innodb default charset utf8 collate utf8_romanian_ci;

为列分配字符集

代码语言:javascript复制
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;

为列分配校验规则

代码语言:javascript复制
 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;

0 人点赞