我有一个表(t),其中列(c)定义为varchar 20,包含值'a','b'和'c'
如果我执行以下sql,则返回一个值:
select * from table where c = 'a '
为什么?
我认为它以某种方式投射/修剪参数,但为什么呢?
我如何真正搜索'a '
答案 0 :(得分:1)
要将其与varchar列进行比较,您的字符串文字也必须是varchar类型。 Varchar会修剪额外的结束空白区域。它变化,因此是VARchar。普通的char类型不修剪空格,如果需要,实际上会在文字的末尾添加额外的空格。您可以检查这一点(并使用LEN()函数修复您的搜索:
declare @a varchar(20) = 'a '
select * from t where c = @a and len(@a) = Len(c)
答案 1 :(得分:1)
指定尾随空格在ANSI SQL标准中以特殊方式处理:
http://support.microsoft.com/default.aspx/kb/316626
http://support.microsoft.com/kb/154886/EN-US/
对char和varchar来说,这种行为实际上是相同的。
答案 2 :(得分:0)
我使用了简单的解决方案:
declare @a varchar(20) = 'a '
select * from t where c + '$' = @a + '$'