原创-转载请注明出处
问题描述
Mysql表A里的字段Name(类型为Varchar),设置了Unique约束。
如果表里已经存在Name为"a"的记录时,如果此时再insert一条Name为“a ”的数据时,数据库就汇报duplicate的错。
在数据库中检查发现
select * from table where name = "a";
select * from table where name = "a ";
检索出来的结果竟然是一样的!都是"a"这条记录。
错误分析
因为在Mysql中,Varchar在进行字符串比较时,会去掉空格,所以“a”和“a ”在select的时候都视为"a"。
解决方法
将Name字段的类型改为Varbinary
结论
Varchar 在查询的时候会去掉最右边的空格,因此在进行字符串比较时,只保留了除最右边的空格剩下的字节。
Varbinary在查询的时候也不会丢弃任何字节,在比较的时候,所有的字节都是有效的。
遇到这个问题的时候,首先想到的是修改unique约束,但是网上全部都是要修改就删掉约束重建的(我也是试着删了重建,但很莫名的删不掉?不得不另寻方法)。相信也有人遇到类似的问题,但至少我没有找到一个真的好好解决问题的文章。
如果文章中有什么不对的不全的还望指出。