mysql笔记三:字符集和比较规则
关键字:字符集、比较规则、字符集转换
3.1、字符集
3.1.1、字符集概念
字符集就是在一定范围内,字符和计算机中二进制数据(0101)的对应关系。
字符转二进制数据为编码,二进制数据转字符为解码。
3.1.2、常用字符集
常用字符集 |
|||
字符集 |
范围 |
1个字符占用字节数 |
说明 |
ASCII |
128个字符 |
1字节 |
|
ISO-8859-1 |
256个字符 |
1字节 |
|
GB2312 |
6763个汉字+682个符号 |
1字节或2字节 |
变长编码方式:在ASCII字符集范围内为1个字节,其余为2个字节 |
BGK |
对GB2312进行扩充 |
1字节或2字节 |
|
unicode |
地球上所有字符 |
1-4字节 |
变长编码,兼容ASCII |
Unicode字符集
unicode字符集 |
|||
字符集 |
编码方案 |
1个字符占用字节数 |
|
unicode |
utf8 |
utf8mb3 |
1~3字节 |
utf8mb4 |
1~4字节 |
||
utf16 |
2或4字节 |
||
utf32 |
4字节 |
3.1.3、查看mysql支持的字符集
SHOW CHARACTER SET
3.2、比较规则
3.2.1、查看mysql支持的比较规则
SHOW COLLATION like "UTF8\_%";
3.2.2、比较规则的命名规律
字符集名_语言_后缀
比如:utf8_polish_ci:utf8字符集,波兰语,不区分大小写
后缀的含义:
后缀的含义 |
||
后缀 |
英文释义 |
含义 |
_ai |
accent insensitive |
不区分重音 |
_as |
accent sensitive |
区分重音 |
_ci |
case insensitive |
不区分大小写 |
_cs |
case sensitive |
区分大小写 |
_bin |
binary |
以二进制比较 |
以二进制比较:比较字符串时,把字符串编码为二进制数据后直接比较二进制数的大小。
同一个字符集下会有多个不同的比较规则。utf8默认的比较规则是utf8_general_ci
3.3.3、比较规则的应用
1)对数据库里的数据进行排序;
2)B+树节点中的数据会根据这个比较规则规则进行排序。
3.3、mysql中指定字符集和比较规则
3.3.1、mysql字符集和比较规则级别
mysql字符集和比较规则有四个级别
服务器级别、数据库级别、表级别、列级别
3.3.2、服务器级别
mysql中提供了2个系统变量来表示服务器级别的字符集和比较规则
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
3.3.3、数据库级别
建库指定:create database 数据库名[[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] collate 比较规则名称]
修改:alter database 数据库名[[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] collate 比较规则名称]
查看:SHOW VARIABLES like 'character_set_database';
SHOW VARIABLES like 'collation_database';
3.3.4、表级别
create table 表名(
字段
) [character set 字符集名称] [collation 比较规则名称]
3.3.5、列级别
create table 表名(
列名 列类型 [character set 字符集名称] [collation 比较规则名称]
);
alter table 表名 modify 列名 列类型 [character set 字符集名称] [collation 比较规则名称]
3.4、字符集转换
3.4.1、什么是字符集的转换
一个程序将接受过来的二进制数据使用A字符集进行解码得到字符串,再用B字符集进行编码得到二进制数据,这个过程称为字符集的转换。
3.4.2、mysql中字符集的转换
mysql从接受客户端请求,到从表中查询出数据,再到将结果返回给客户端会进行多次字符集的转换,牵扯到3个系统变量,分别是
character_set_client、character_set_connection、character_set_results
注:1)mysql服务器默认认为客户端使用的是character_set_client对应的字符集进行编码的;
2)mysql服务器会对结果使用character_set_results对应的字符集进行编码;
3)设置character_set_client、character_set_connection、character_set_results为同一个编码:
SET NAMES 字符集名