简介
每个字符集对应若干校对规则(collation),如果不指定,会有默认校对规则;
服务器有字符集、数据库有字符集、表有字符集、列有字符集,如果不指定,会继承父字符集,有了字符集如果不设置校对规则,就使用字符集的默认校对规则。在做比较时,最终起作用的是列的字符集和校对规则。
比如 table1.col1=table2.col2,首先会拿table1.col1的校对规则与table2.col2的校对规则,进行比较,如果校对规则不兼容,就会出现,类似
Error Code: 1267. Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=' 的错误
_ci _cs _bin解释
ci: case insensitive,大小写不敏感,不区分大小写比较
cs: case sensitive,大小写敏感,区分大小写比较
bin: binary,二进制,使用二进制比较
选择了,大小写不敏感的校对规则,比如utf8_general_ci,那么select * from table1 where name='a',那么会获取name=a或者A的数据,而不仅仅是a
命令
/*查看数据库当前的字符集和校对规则*/
show variables like '%character%';
show variables like '%collation%';
/*查看表的校对规则*/
show table status from db_name like '%table_name%' ;
/*查看列的校对规则*/
show full columns from table_name;
/*查看数据库支持的字符集和校对规则*/
show charset;或者 show character set;
show collation;
查看字符集及对应的默认校对规则,数据库版本8.0.29
SHOW CHARACTER SET;
select * from INFORMATION_SCHEMA.CHARACTER_SETS;

查看所有校对规则 ,数据库版本8.0.29
select * from INFORMATION_SCHEMA.COLLATIONS ;
SHOW COLLATION;

由于多字节编码的缘故,字符个数不一定等于字节数,所以在查询时,注意区分,length是字节数,char_length是字符数
select length('你');/*结果是3,3个字节,数据库采用的utf8编码*/
select char_length('你');/*结果是1,1个字符*/





本文详细介绍了数据库中字符集及其校对规则的概念,包括不同校对规则的区别(如_ci、_cs、_bin),如何查看数据库、表、列的字符集与校对规则,以及如何解决因校对规则不兼容导致的错误。
1436

被折叠的 条评论
为什么被折叠?



