今天发现一个奇怪的问题,在一个varchar(255)的列中,通过where…… =……进行查询时,无论查询词后面添加多少个空格,都一样可以匹配。这个问题吓了我一跳,如果玩家昵称后面带有空格,则会引起玩家查询混乱。
如'a '='a',返回结果是相等
查了一下,原来SQL检索里,=比较时,会把两个字符串补空格为一样长度,再做比较,所以后面带有空格,则会引起这些问题。奇怪的SQL规范!
http://support.microsoft.com/kb/316626/zh-cn
SQL Server 遵循 ANSI-92 / ISO SQL 规范 (部分 8.2,< 比较谓词 >,常规规则 # 3) 如何比较带空格的字符串。 ANSI 标准要求填充字符,以便其长度符合比较它们之前,在比较中使用的字符串。 在填充直接影响 WHERE 的语义 HAVING 子句谓词和其他 Transact-SQL 字符串比较。 是例如 Transact-SQL 认为字符串 abc 和 abc 是等效的大多数比较操作。
此规则唯一的例外是 LIKE 谓词。 LIKE 谓词表达式的右侧具有一个尾随空格的值时, SQL Server 会不填充两个值为相同的长度比较之前。 因为 LIKE 谓词定义的目的是简化模式搜索而不是简单的字符串相等测试,这不会违反 ANSI SQL-92 规范前面提到的部分。