我的名字和姓氏后面带有空格。我有两个 SQL 查询 - 即使我搜索时没有空格,第一个查询也会返回结果。 (第一个查询返回不需要的结果)。
- 此行为在所有版本的 SQL Server 中是否一致?
- 这是一种已知的行为吗?它是否记录在
msdn
for SQL Server 2008 R2
?
CODE
DECLARE @NameTable TABLE (first_name varchar(40),last_name varchar(40))
INSERT INTO @NameTable VALUES ('STEVEN ','STANLEY ');
--QUERY 1
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM @NameTable A
WHERE (first_name = 'STEVEN')
AND (last_name = 'STANLEY')
--QUERY 2
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM @NameTable A
WHERE (( ISNULL(first_name,'')+' ' +ISNULL(last_name,'') ) = 'STEVEN STANLEY')
--QUERY 3 (With LTRIM and RTRIM)
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM @NameTable A
WHERE (( ISNULL(LTRIM(RTRIM(first_name)),'')+' ' +ISNULL(LTRIM(RTRIM(last_name)),'') ) = 'STEVEN STANLEY')
参考:
- 数据长度 http://msdn.microsoft.com/en-in/library/ms173486.aspx
- 在 SQL Server 2005 中,len() 和 datalength() 有什么区别? https://stackoverflow.com/questions/558102/in-sql-server-2005-what-is-the-difference-between-len-and-datalength
Refer http://support.microsoft.com/kb/316626 http://support.microsoft.com/kb/316626
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 规范的部分。
如果你想避免这种情况,你可以添加一个添加条件,如下所示
Refer: 数据长度 http://msdn.microsoft.com/en-in/library/ms173486.aspx
SELECT first_name AS [FirstName], last_name AS [LastName],first_name+last_name,LEN(first_name+last_name)
FROM @NameTable A
WHERE (first_name = 'STEVEN') and DATALENGTH(first_name)=DATALENGTH(RTRIM(first_name))
AND (last_name = 'STANLEY') and DATALENGTH(last_name)=DATALENGTH(RTRIM(last_name))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)