28 八月, 2005
MySQL char type field is case insensitive
用惯了Oracle,对MySQL中的很多默认属性很不习惯。譬如今天碰到的这个问题,我有一张表,里面有一个name字段,NOT NULL,并且加上了UNIQUE限制。第一次,插入‘AJaX’,正常,第二次,想插入‘AJAX’,失败,报告ERROR 1062:duplicate key错误。查了才知道,原来MySQL对char/varchar类型的字段,在匹配的时候是不区分大小写的,除非在建表的时候指定此列的BINARY属性(参考)。晕啊。建议大家要么加上BINARY属性,要么不要添加UNIQUE(或者PRIMARY)限制。对应的,是用一个CHAR(32)的MD5的结果作为唯一键值比较合适。
还有NOT NULL属性,这个在Oracle里面,其实是一个‘check’限制,如果试图插入NULL值,会出错。但是MySQL不会,那么它插入的是个什么数值呢?如果你设置了DEFAULT VALUE,那很简单,就是这个缺省数值,万一没有设呢?我用char类型试了一下,select bin(x)出来的结果是NULL,但是,你用IS NULL这个条件query是查不到结果的。再晕。所以,奉劝大家,如果指定某列NOT NULL,千万要加上DEFAULT VALUE,否则,会出现一些稀奇古怪的后果。
发现一篇文章,MySQL Gotchas,我最近使用MySQL开发碰到的问题,这里基本上都提到了,推荐。
最新回复
发表评论



