字符集
ASCII字符集:英文字母、数字、标点符号、不可见的字符
ISO 8859-1字符集:扩充了128个西欧字母,别名latin1
GB2312:有了汉字,并且兼容了ASCII
如果该字符在ASCII字符集中,则用1个字节表示
否则采用3个字节编码
GBK字符集:对GB2312进行了扩充,兼容GB2312
utf8字符集:属于unicode,用1-4个字节;
utf16字符集:属于unicode,用2-4个字节;
utf32字符集:属于unicode,用4个字节表示;
mysql中的字符集和排序规则
对utf8进行了区分:
- utf8mb3:只用1-3个字节表示,但是在mysql中默认的名字是utf8
- utf8mb4:用1-4个字节表示
支持字符集
utf8支持比较规则
每种字符集对应若干个比较规则,每种字符集都有一种默认的比较规则。
字符集和比较规则的应用
服务器级别
服务器默认的字符集编码:latin1,也就是那个ISO编码咯
当然也可以在配置文件中修改server启动时,用什么编码方式
数据库级别
创建数据库的时候,没有设置字符集和比较规则,那么就直接随了服务器了。
create database 数据库名 character set 字符集名称 collate 比较规则; alter database 数据库名 character set 字符名称 collation 比较规则; show variables like ‘character_set_database‘; show variables like ‘collation_database‘‘ # 假如设置了字符集,会默认给一个比较规则
表级别
create table 表名(列信息)character set 字符集名称 collate 比较规则; alter table 表名 character set 字符集名称 collate 比较规则名称;
列级别
create table 表名( 列名 字符串类型 character set 字符集名称 collate 比较规则名称 ) alter table 表名 modify 列名 字符串类型 character set 字符集名称 collate 比较规则名称;
如果列中包含了汉字,那就不可以转换为latin1,要不然会出错的。
只修改字符集,则比较规则将变为修改后的字符集默认的比较规则
只修改比较规则,则字符集将变为修改后的比较规则对应的字符集
各级别字符集和比较规则小结
- 如果创建或修改列时,没有显式的指定字符集和比较规则,则将该列默认用表的字符集和比较规则
- 如果创建或者修改表时,没有显式指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
- 如果创建或修改数据库时,没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则
客户端和服务器通信中的字符集
- 客户端发送请求所使用的字符集,和当前操作系统一致
- 服务器接受到客户端发送过来的请求其实时遗传二进制的自己,通过characrer_set_client解码,然后编码成为character_set_connection
- 服务器端将通过character_set_connection编码之后的二进制,查询结果通过 character_set_results编码,发送给客户端
- 客户端再将结果,解码。
character_set_client
character_set_connection
character_set_results
本来需要设置三个编码:
set character_set_client = 字符集名 set character_set_connection = 字符集名 set character_set_results = 字符集名
但是为了方便:
set names 字符集名
也需要在客户端的启动配置文件当中:
default-character-set = utf8
比较规则的应用
select * from 表名 order by col;
比较规则通常体现在比较字符串大小的表达式以及对某个字符串列进行排序中
我将我的所有都设置成了utf8