Varchar的行为,末尾有空格


14

当我将Varchar与空格一起使用时,它最后会忽略空格。

例如:

declare @X varchar(50)

这个...

set  @X= 'John'

...是相同的...

set @X= 'John           '

它认为这些是相等的。如何使系统将它们识别为不同的?

Answers:


23

一切都符合ANSI标准:

尾随空白说明

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规范的部分。

这是上述所有情况的众所周知的示例:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

这是有关尾随空格和LIKE子句的更多详细信息。

但是,如果您想区别它们-您可能决定使用DATALENGTHfunction而不是LEN,因为

SELECT 1 WHERE LEN('John ') = LEN('John')

会让你1而不是

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

解决方法

  • 使用DATALENGTH函数在字符串之间有所不同
  • 将字符串转换为NVARCHAR类型-最好将其声明为SP的参数

壮观的帖子,终于找到了一些不错的信息
Gaspa79,18年

-2

您可以简单地在条件中添加一个空格。

set @X= 'John           \n'

字符串函数中的尾随空格


5
\n在SQL Server中没有任何意义。它不解释为新行。无论如何,这不是答案。
马丁·史密斯

@MartinSmith,但是它是用MSDN编写的:“如果字符串中必须包含尾随空格,则应考虑在末尾添加空格字符,以使SQL Server不会修剪字符串。”
宜坪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.