mysql在建表的时候可以指定字符集和校对规则。校对规则有三种形式的结尾,_ci 代表了大小写不敏感,_cs是大小写敏感,_bin是二进制,也是大小写敏感的。
默认的校对规则是大小写不敏感的,所以如何我们建了这样一张表:
然后查询
将会返回两条记录。
如果我们需要大小写敏感的查询,可以临时改变其校对规则:
另外mysql中char和varchar末尾的空格会被忽略,
同样会返回两条结果,所以如果n上有unique index,那么只有末尾空格数有差别的两条记录会被认为是重复的。
如果希望比较末尾的空格,需要使用
同样这种形式也不能用到索引。
如果确实需要区别末尾的空格,可以使用varbinary类型,它是保存二进制的字符串,比较时也使用二进制,没有校对规则。
如
默认的校对规则是大小写不敏感的,所以如何我们建了这样一张表:
create table t (n varchar(10)) default charset=latin1;
insert into t values('w'), ('W');
然后查询
select * from t where n = 'w';
将会返回两条记录。
如果我们需要大小写敏感的查询,可以临时改变其校对规则:
select * from t where n collate latin1_general_cs = 'w';这样将只有一条记录返回,但是如果n上有索引,那么索引通常是不能被使用的。
另外mysql中char和varchar末尾的空格会被忽略,
select * from t where n = 'w ';
同样会返回两条结果,所以如果n上有unique index,那么只有末尾空格数有差别的两条记录会被认为是重复的。
如果希望比较末尾的空格,需要使用
select * from t where binary n = 'w ';
同样这种形式也不能用到索引。
如果确实需要区别末尾的空格,可以使用varbinary类型,它是保存二进制的字符串,比较时也使用二进制,没有校对规则。
如
alter table t modify n varbinary(10);