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';

相关文章:

  • 2021-07-29
  • 2021-11-28
  • 2021-09-05
  • 2021-04-08
  • 2021-09-01
  • 2021-06-19
猜你喜欢
  • 2022-12-23
  • 2021-12-05
  • 2021-12-04
  • 2022-12-23
  • 2021-11-06
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案