MySQL

40-MySQL字符集

2022-09-20  本文已影响0人  紫荆秋雪_文

在MySQL 8.0版本之前,默认字符集为 latin1 ,utf8字符集指向的是 utf8mb3 。网站开发人员在数据库设计的时候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL 8.0开始,数据库的默认编码将改为 utf8mb4 ,从而避免上述乱码的问题

1、查看默认使用的字符集

SHOW VARIABLES LIKE 'character%';
或
SHOW VARIABLES LIKE '%char%';
image.png

2、修改字符集

vim /etc/my.cnf
character_set_server=utf8
systemctl restart mysqld
alter database dbtest1 character set 'utf8';
alter table t_emp convert to character set 'utf8';

3、各级别的字符集

服务器级别
数据库级别
表级别
列级别

show variables like 'character%';
或
SHOW VARIABLES LIKE '%char%';
image.png

1. 服务器级别

我们可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用 SET 语句修改这两个变量的值。比如我们可以在配置文件中这样写

[server] 
character_set_server=gbk # 默认字符集 
collation_server=gbk_chinese_ci #对应的默认的比较规则

2. 数据库级别

们在创建和修改数据库的时候可以指定该数据库的字符集和比较规则

CREATE DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称];

3. 表级别

我们也可以在创建和修改表的时候指定表的字符集和比较规则

CREATE TABLE 表名 (列的信息) [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]]

ALTER TABLE 表名 [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]

4. 列级别

对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。我们在创建和修改列
定义的时候可以指定该列的字符集和比较规则

CREATE TABLE 表名
(
    列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称], 其他列
    ...
);

ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

4. 小结

5.字符集与比较规则

1. utf8 与 utf8mb4

2. 比较规则

MySQL版本一共支持41种字符集,其中的 Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如 utf8_polish_ci 表示以波兰语的规则比较, utf8_spanish_ci 是以西班牙语的规则比较, utf8_general_ci 是一种通用的比较规则。后缀表示该比较规则是否区分语言中的重音、大小写

image.png
#查看GBK字符集的比较规则 
SHOW COLLATION LIKE 'gbk%';

#查看UTF-8字符集的比较规则 
SHOW COLLATION LIKE 'utf8%';
#查看服务器的字符集和比较规则 
SHOW VARIABLES LIKE '%_server'; 

#查看数据库的字符集和比较规则 
SHOW VARIABLES LIKE '%_database'; 

#查看具体数据库的字符集 
SHOW CREATE DATABASE dbtest1;

 #修改具体数据库的字符集 
ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

#查看表的字符集 
show create table employees; 

#查看表的比较规则 
show table status from atguigudb like 'employees'; 

#修改表的字符集和比较规则 
ALTER TABLE emp1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

3.请求到响应过程中字符集的变化

image.png

4、举例

SELECT * FROM t WHERE s = '我';

为了方便大家理解这个过程,我们只分析字符 '我' 在这个过程中字符集的转换

现在看一下在请求从发送到结果返回过程中字符集的变化:
上一篇下一篇

猜你喜欢

热点阅读