Shi*_*rod 5 t-sql entity-framework-6
我有这个查询:
select '[' + p.Firstname + ']' from Person p
where p.Firstname = 'Johanne'
Run Code Online (Sandbox Code Playgroud)
在表中,我有多个人有这个名字,有些人在值上有一个尾随空格(值的错误插入,它将被更正)。
为什么这个查询会给我带来这个结果(我插入了括号来可视化空格):
[Johanne]
[Johanne ]
[Johanne ]
[Johanne]
Run Code Online (Sandbox Code Playgroud)
这是配置问题吗?真正的查询来自实体框架 6,但这个例子也这样做了。我该如何预防?
谢谢 !
编辑:我可以使用 EF6 和这样的System.Data.Entity.SqlServer.SqlFunctions.DataLength方法使其工作:
ctx.Person.FirstOrDefault(p => p.FirstName == "Johanne" && SqlFunctions.DataLength(p.FirstName) == "Johanne".Length);
Run Code Online (Sandbox Code Playgroud)
SQL Server 遵循有关如何比较字符串与空格的 ANSI/ISO SQL-92 规范(第 8.2 节,一般规则 #3)。ANSI 标准要求对比较中使用的字符串进行填充,以便在比较它们之前它们的长度匹配。填充直接影响 WHERE 和 HAVING 子句谓词以及其他 Transact-SQL 字符串比较的语义。例如,Transact-SQL 认为字符串 'abc' 和 'abc ' 对于大多数比较操作是等效的。
此规则的唯一例外是 LIKE 谓词。当 LIKE 谓词表达式的右侧包含一个带有尾随空格的值时,SQL Server 在进行比较之前不会将这两个值填充到相同的长度。因为根据定义,LIKE 谓词的目的是促进模式搜索而不是简单的字符串相等性测试,所以这不违反前面提到的 ANSI SQL-92 规范部分。
请参阅:http : //support2.microsoft.com/kb/316626/en-us