一.常用字符编码
1.ASCII编码
用一个字节表示一个字符
2.ANSI编码
每个国家为了显示本国的语言而对ASCII码进行了拓展
用两个字节表示一个汉字,中国的ANSI编码是GB2312编码(简体),日本的ANSI编码是JIS编码,台湾的ANSI编码是BIG5编码(繁体)
3.GBK编码
对GB2312进行的扩展,用来显示罕见的、古汉语的汉字。
4.Unicode编码
用四字节表示一个字符
5.UTF-8编码
国际通用字符库,涵盖了地球上人类的所有的语言文字
可以识别字符,如果字符是简单的字母,就用一字节存储,如果是复杂的生僻字,就用四字节存储
utf8不支持表情符号emoji,utf8mb4支持表情符号emoji
二.字符编码全局设置
1.原因
用户在向网站服务端进行数据信息存储时,由于数据库服务系统默认的字符编码设置问题,可能会导致出现字符乱码,为了能更准确地识别数据库中的中文字符信息,需要对数据库服务配置文件中的默认字符编码设置进行调整
2.显示所有可用的字符集
show charset;
3.查询 MySQL 中所有包含“char”关键字的系统变量(通常是与字符集和字符编码相关的系统变量)
show variables like '%char%';
注意这些是否是一样的
4.在/etc目录将数据库服务配置文件进行备份
cp my.cnf my.cnf.bak
5.修改配置文件
vim /etc/my.cnf
在[mysqld]区域写入
character-set-server=gbk
6.重启以重新加载配置文件
systemctl restart mysqld
7.再次查看
show variables like '%char%';
8.查看新创建的数据库的字符集
show databases;
create database yong65535;
show create database yong65535;
9.编辑修改客户配置文件参数信息
client.cnf是客户端配置文件信息
vim /etc/my.cnf
在[client]区域内写入
default-character-set=gbk
10.重启和查看
systemctl restart mysqld
show variables like '%char%';
或
show variables like 'character_set_%';
11.最后修改回去
vim /etc/my.cnf
三.字符编码局部设置
1.指定某一数据库的字符集
在创建库时指定字符集就行了
如创建qwq数据库,指定字符集为gbk
create database qwq charset gbk;
查看该数据库信息
show create database qwq;
2.指定数据库中某一个表的字符集
在创建表时指定字符集就可以了
先进入qwq数据库
use qwq;
3.查看新创建的表优先使用默认全局的字符集还是优先使用这一数据库的字符集
创建t1表,该表有表项id,数据类型为int
create table t1(id int);
查t1表信息
show create table t1;
由此可见优先继承的是数据库的字符集
4.创建t2表,该表有表项id类型为int,且指定使用的字符集为utf8mb4;
create table t2(id int) charset utf8mb4;
查看表t2内容
show create table t2;
四.参数信息、解释说明及其关系图
1.参数信息及其解释说明
character_set_client:用来设置客户端默认使用的字符集
character_set_connection:用来设置连接数据库时默认的字符集
character_set_database:用来设置创建数据库默认的编码格式
character_set_filesystem:文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把character_set_client转换character_set_filesystem,默认binary是不做任何转换
character_set_results:数据库给客户端返回时默认使用的编码格式
character_set_server:服务器安装时指定的默认编码格式,这个变量建议由系统管理,不要认为定义
character_set_system:数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是存储系统元数据的编码格式
character_sets_dir:这个变量是字符集安装的目录
2.关系图
举例说明:
SET character_set_client = gbk;
SET character_set_connection = utf8mb4;
SET character_set_results = latin1;
内部操作字符集=utf8mb4
过程:
客户端字符串(中文)
--用gbk编码--> 字节流(gbk)
↓
服务器用character_set_client=gbk解码成字符
↓
服务器用character_set_connection=utf8mb4编码字符用于SQL执行
↓
插入时转为表字符集utf8mb4编码写入磁盘
↓
查询时从磁盘取utf8mb4字节流
↓
转成字符序列
↓
根据character_set_results=latin1编码成latin1字节流返回客户端
↓
客户端用latin1解码成字符显示
3.注意事项
客户端字符集设置要和服务器对应,避免字符集不匹配导致乱码,一般建议客户端、连接、结果、表字段都统一用utf8mb4,以减少字符集转换复杂度和乱码风险
五.编码排序(校对)规则
根据设置的排序规则不同,查询信息时,影像数据信息的查询输出和排序效果
1.所有已用的字符排序规则
show collation;
2.排序规则后缀及其解释
后缀 | 含义及解释 |
---|---|
_ci | Case Insensitive(不区分大小写) |
字符比较时忽略大小写,‘a’与‘A’视为相同。是最常用的后缀。 | |
_cs | Case Sensitive(区分大小写) |
字符比较时区分大小写,‘a’和‘A’被视为不同字符。 | |
_bin | Binary(二进制) |
按照字符的二进制值(ASCII码或Unicode码)逐字节比较,区分大小写且不考虑语言规则。速度快,精确比较。 | |
_ai | Accent Insensitive(不区分重音符号) |
忽略字符的重音符号(例如é和e视为相同),通常和ci结合使用,如utf8mb4_0900_ai_ci 。 | |
_as | Accent Sensitive(区分重音符号) |
区分带重音符号和不带重音符号的字符。 | |
0900 | 代表使用Unicode Collation Algorithm版本 9.0.0的排序规则。 |
比如utf8mb4_0900_ai_ci ,这是MySQL 8.0及以后版本引入的新排序规则,支持更准确的Unicode排序。 |
3.对库设置校对规则
在创建数据库时指定
create database qoq charset utf8 collate utf8_general_mysql500_ci;
查看这个数据库信息
show create database qoq;
4.对表设置校对规则
create table t1 (id int) charset utf8 collate utf8_german2_ci;
5.演示校对规则不同的效果
创建三个表,有表项info,char(3)类型,utf8mb4编码,排序规则各不相同
区分大小写
CREATE TABLE t3 (info CHAR(3)) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
不区分大小写
CREATE TABLE t4 (info CHAR(3)) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
ascii码存储
CREATE TABLE t5 (info CHAR(3)) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
向三个表插入相同的数据
insert into t3 values('a'),('A'),('b'),('B'),('c'),('C');
insert into t4 values('a'),('A'),('b'),('B'),('c'),('C');
insert into t5 values('a'),('A'),('b'),('B'),('c'),('C');
查询数据信息
select * from t3 where info='a';
select * from t4 where info='a';
select * from t5 where info='a';
排序处理
select * from t3 order by info;
select * from t4 order by info;
select * from t5 order by info;
校对规则还会影响数据排序结果,因此也成为排序规则
六.修改数据库的字符集
1.直接转换,此方法只会影响之后存储的数据,不会修改之前存储的数据
查看当前的字符集
show create table t1;
修改成utf8mb4,之后再次查看
alter table t1 charset utf8mb4;
show create table t1;
2.间接修改
锁表逻辑(别让用户再写数据了)导出数据(例如:mysqldump),重新创建数据空表(设定目标字符集),导入备份数据信息
可以影响之后存储的数据,也可以影响之前的数据
注意必须保证修改之后的数据字符集是之前字符集的超集