1+1=3? Space 个 nvarchar 变量中的字符和字符串长度

1+1=3? Space characters in nvarchar variables and string lengths

我刚刚偶然发现了这个:

为什么下面的代码没有:

DECLARE @s nvarchar(10) = N' '

PRINT CONCAT('#', @s, '#')
PRINT CONCAT('#', LEN(@s), '#')

结果为输出

##
#0#

# #
#1#

然而,在 SQL Server 2017 上,此代码生成输出

# #
#0#

这对我来说似乎是矛盾的。

字符串的长度为 0 且为 '' 或长度为 1 且为 ' '。

如果添加以下代码,整个事情会变得更加奇怪:

DECLARE @s nvarchar(10) = N' '

PRINT CONCAT('#', @s, '#')
PRINT CONCAT('#', LEN(@s), '#')

DECLARE @l1 int = LEN(CONCAT('#', @s, '#'))

PRINT LEN(@s)
PRINT LEN('#')
PRINT @l1

输出如下:

# #
#0#
0
1
3

所以我们有三个子字符串,一个长度为0,两个长度为1。那么整个字符串的长度是3?我很困惑。

如果你用几个空格填充@s,它看起来更有趣 - 例如5 个空格导致此输出:

#     #
#0#
0
1
7

所以这里是 1×0 + 2×1 甚至 7。我希望我的银行能这样计算我的账户余额。

谁能给我解释一下这是怎么回事?

非常感谢您的帮助!

LEN

Returns the number of characters of the specified string expression, excluding trailing spaces.

所以 LEN(' ') = 0(只有空格),但是 LEN(' x') = 2(没有尾随空格)。

LEN excludes trailing spaces. If that is a problem, consider using the DATALENGTH (Transact-SQL) function which does not trim the string. If processing a unicode string, DATALENGTH will return twice the number of characters.