我正在尝试使用Where语句从数据库中检索数据,并且如果在字符串的末尾添加了空格,它总是返回数据,所以
.Where(p => p.Username == "sysadmin")
和
.Where(p => p.Username == "sysadmin ")
两者都返回数据(我希望第二个返回null)。同样的事情是使用WebSecurity.Login
方法,它在两种情况下都成功登录。
答案 0 :(得分:3)
reason为什么这样做是:
SQL Server遵循ANSI / ISO SQL-92规范(第8.2节, 关于如何将字符串与空格进行比较的一般规则#3)。 ANSI 标准要求填充使用的字符串 比较,以便在比较它们之前它们的长度匹配。该 padding直接影响WHERE和HAVING子句的语义 谓词和其他Transact-SQL字符串比较。例如, Transact-SQL考虑字符串' abc'和' abc'相当于 对于大多数比较操作。
此规则的唯一例外是LIKE谓词。当正确的时候 LIKE谓词表达式的一侧具有带尾随的值 空间,SQL Server不会将这两个值填充到相同的长度 在比较之前。因为喜欢的目的 根据定义,谓词是为了促进模式搜索 比简单的字符串相等测试,这不违反该部分 前面提到的ANSI SQL-92规范。
您可以尝试执行以下操作:
.Where(p => p.Username.Trim() == "sysadmin")