tsql - SQL Server 是否在查询时自动修剪 nvarchar 字段?

标签 tsql entity-framework-6

我有这个查询:

select '[' + p.Firstname + ']' from Person p
where p.Firstname = 'Johanne'

在表中,我有多个人有这个名字,有些人在值上有一个尾随空格(值的错误插入,将被更正)。

为什么这个查询会给我带来这个结果(我插入了括号来可视化空格):
[Johanne]
[Johanne ]
[Johanne ]
[Johanne]

这是配置问题吗?真正的查询来自 Entity Framework 6,但这个例子也这样做了。我该如何预防?

谢谢 !

编辑:我可以使用 EF6 和 System.Data.Entity.SqlServer.SqlFunctions.DataLength 使其工作像这样的方法:
ctx.Person.FirstOrDefault(p => p.FirstName == "Johanne" && SqlFunctions.DataLength(p.FirstName) == "Johanne".Length);

最佳答案

SQL Server 遵循有关如何比较字符串与空格的 ANSI/ISO SQL-92 规范(第 8.2 节,一般规则 #3)。 ANSI 标准要求对比较中使用的字符串进行填充,以便在比较它们之前它们的长度匹配。填充直接影响 WHERE 和 HAVING 子句谓词以及其他 Transact-SQL 字符串比较的语义。例如,Transact-SQL 认为字符串 'abc' 和 'abc ' 对于大多数比较操作是等效的。
此规则的唯一异常(exception)是 LIKE 谓词。当 LIKE 谓词表达式的右侧包含一个带有尾随空格的值时,SQL Server 在进行比较之前不会将这两个值填充到相同的长度。因为根据定义,LIKE 谓词的目的是促进模式搜索而不是简单的字符串相等性测试,所以这不违反前面提到的 ANSI SQL-92 规范部分。
见:https://support.microsoft.com/en-us/topic/inf-how-sql-server-compares-strings-with-trailing-spaces-b62b1a2d-27d3-4260-216d-a605719003b0

关于tsql - SQL Server 是否在查询时自动修剪 nvarchar 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682660/

相关文章:

sql - TSQL 透视多个列

c# - Entity Framework 到 MySql 连接到数据库失败

asp.net-mvc - 是否可以使用 Entity Framework 代码优先设置唯一约束?

loops - 循环中的异步和等待多个任务,如何返回单个任务

c# - 排除 SQLException 问题

sql - SQL 中的 CROSS JOIN 与 INNER JOIN

sql-server - 如何增加数据库文件?

sql - 没有聚合函数的 TSQL Pivot

c# - Linq 将许多表的结果转换为具有嵌套类的继承类

sql - 向3个相关表中插入数据