mysql字符集
可以通过show charset命令查看mysql支持的所有字符集及各字符集默认的比对方法。charset,是character set的简称。可以看出约有41种字符集,latin1字符集默认的比对方法是latin1_swedish_ci(swedish意思是瑞典),utf8字符集默认的比对方法是utf8_general_ci,utf8mb4字符集默认的比对方法是utf8mb4_general_ci,utf16字符集默认的比对方法是utf16_general_ci,utf32字符集默认的比对方法是utf32_general_ci。默认字符集是latin1。
show charset支持通配符查询,如show charset like '%utf%';
可以通过show collation命令查看mysql支持的所有比对方法及相应字符集。可以看出约有222种比对方法。一个字符集可以有多个比对方法,相同的字符串,在不同的比对方法下,排序结果可能会不同。还可以看出utf8字符集相应的比对方法有utf8_general_ci、utf8_bin、utf8_unicode_ci、utf8_icelandic_ci、utf8_general_mysql500_ci等共计27种比对方法。utf8mb4字符集相应的比对方法有utf8mb4_general_ci、utf8mb4_bin、utf8mb4_unicode_ci、utf8mb4_icelandic_ci等共计26种比对方法。
show collation也支持通配符,如show collation like '%utf8%';
show collation也支持where查询,如show collation where charset = 'utf8';
collation名称一般有3种格式:
${charset}_bin,如big5_bin、latin1_bin、ascii_bin、gb2312_bin、gbk_bin、utf8_bin、utf8mb4_bin、utf16_bin、utf32_bin。
${charset}_general/${country}_ci/cs,如big5_chinese_ci、
latin1_general_ci、latin1_general_cs、latin1_swedish_ci、
ascii_general_ci、
gb2312_chinese_ci、gbk_chinese_ci、
utf8_general_ci、utf8_unicode_ci、utf8_swedish_ci、
utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_swedish_ci、
utf16_general_ci、utf16_unicode_ci、utf16_swedish_ci、
utf32_general_ci、utf32_unicode_ci、utf32_swedish_ci。
除了以上2种格式,还有许多unicode相关的比对方法,如utf8mb4_unicode_ci、utf16_unicode_ci、utf32_unicode_ci。
以bin为后缀的collation,将字符串的每个字符以二进制存储,区分大小写。
以ci为后缀的collation,在比对时不区分大小写。ci,全称是case insensitive。假如筛选条件是where name = 'a',那么不仅会查询出name='a'的记录,还有查询出name='A'的记录。同样,在排序时,会把'a'和'A'当做一样。
以cs为后缀的collation,在比对时区分大小写。cs,全称是case sensitive。假如筛选条件是where name = 'a',那么仅会查询出name='a'的记录, 不会查询出name='A'的记录。同样,在排序时,由于a字符对应的ascii是97,A对应的ascii是65,会认为a > A。
collate可以在实例级别、库级别、表级别、列级别、以及sql级别指定。
1、实例级别,即在mysql服务器的配置文件中指定。
在my.cnf文件中添加:
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
查看实例级别的字符集及比对方法:show variables like '%char%';show variables like '%collat%';
2、库级别,即在创建数据库的时候指定。如create database d1 default charset utf8mb4 collate utf8mb4_unicode_ci;
查看库级别的字符集及比对方法:show create database d1;
3、表级别,即在创建表的时候指定。如create table t1 (id int primary key auto_increment, name varchar(4) not null) engine=InnoDB charset=utf8mb4 collate=utf8mb4_unicode_ci;
查看表级别的字符集及比对方法:show table status like 't1';
4、列级别,即在指定字段类型的时候指定。如create table t2 (id int primary key auto_increment, name varchar(4) charset utf8mb4 collate utf8mb4_unicode_ci not null) engine=InnoDB;
查看列级别的字符集及比对方法:show full columns from t1;show full columns from t1 where field = 'name';
5、sql级别,即在查询的时候指定。如
select * from t1 where name collate utf8mb4_unicode_ci = 'a';
select * from t1 order by name collate utf8mb4_unicode_ci;
一般库级别和表级别最常用,列级别、sql级别就不建议用了,避免给其他开发人员留坑。而实例级别的一般不由开发人员控制,而是由DBA、运维人员管理。
如果创建数据库时没有指定字符集及比对方法,则数据库会继承实例级别的字符集及比对方法。
如果创建表时没有指定字符集及比对方法,则表会继承库级别的字符集及比对方法。
如果创建字符串类型字段时没有指定字符集及比对方法,则字段会继承表级别的字符集及比对方法。
如果在查询时没有指定字符集及比对方法,则会使用字段的字符集及比对方法。
在ci的collation下,如果想在比对时区分大小写,则需要使用binary关键字,如:
select * from t1 where name = binary 'a';