MySQL之字符集及校对集

本篇对数据库使用时的字符集及校对集进行总结~

1、数据库字符集

字符集是各种文字和符号在计算机中的总称;charset / character set。

  • 常见字符集
    • ASCII:美国信息交换标准码,一般英文符号,一个字节存储
    • latin1:拉丁文,一个字节存储,ISO-8859-1的别名
    • GBK:汉字内码扩展规范,两个字节表示
    • Unicode:万国码(统一码),使用统一的编码方式来解决传统的局限
    • UTF-8:8-bit万国码,针对Unicode的可变长度字符编码,目前通用

2、MySQL字符集

  • 内部对象可在各个层级设置字符集,且存在继承:字段->表->数据库->DBMS
  • 客户端与服务器端交互时,需明确告诉服务器客户端自己用什么字符集。
  • 数据存储的最终字符集由字段控制。
#查看MySQL支持的所有字符集
show charset;

3、乱码问题

  • 本质原因:客户端与服务器端的字符集不一致
  • 解决方案:保证服务端正确理解客户端的字符集格式
#MySQL客户端(CMD打开),字符集是固定的GBK
set names gbk;

4、字符集设置原理:

  • MySQL服务端提供变量来记录客户端的字符集
  • set names 字符集即可对变量修改:
    • character_set_client:客户端
    • character_set_results:结果集
    • character_set_connection:连接层
    • 简单统一方式:set names 客户端字符集
# 查看系统内部存储字符集的信息
# %表示通配符,匹配后续所有不确定的数据
show variables like 'character_set%';	
# 使用set names 字符集批量修改,保证客户端被服务端正确理解,同时客户端也能正确解析
set names gbk;

5、校对集

  • collate、collation,数据比较时对应的规则。
  • 校对集依赖字符集;校对方式有三种:
    • 大小写不敏感:_ci,case insensitive(不区分大小写)
    • 大小写敏感:_cs,case sensitive(区分大小写)
    • 二进制比较:_bin,binary(区分大小写)

6、设置校对规则

  • 设置校对集 collate 校对集规则;
  • 查看MySQL支持的所有校对集 show collation;
  • 在数据库层设置校对集(常见)
create database db_4 charset utf8mb4 collate utf8mb4_bin;

7、校对集应用

通过数据比较时会触发:order by 字段

  • 校对集的维护要在数据产生之前
  • 数据产生之后校对集的修改将无效

示例:创建校对规则数据表并插入数据

# 创建默认校对规则表(不区分大小写)
create table t_1(
	name varchar(1)
)charset utf8mb4;
insert into t_1 values('B');
insert into t_1 values('A');
insert into t_1 values('b');
insert into t_1 values('a');

# 创建二进制校对规则(区分大小写)
create table t_2(
	name varchar(1)
)charset utf8mb4 collate utf8mb4_bin;
insert into t_2 values('B');
insert into t_2 values('A');
insert into t_2 values('b');
insert into t_2 values('a');

触发校对:进行排序 order by

select * from t_1 order by name; # 升序
select * from t_2 order by name;

对数据已经存在的表修改校对规则是无效的

alter table t_2 collate utf8mb4_general_ci;

你可能感兴趣的:(MySQL)