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。我希望我的银行能这样计算我的账户余额。
谁能给我解释一下这是怎么回事?
非常感谢您的帮助!
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.
我刚刚偶然发现了这个:
为什么下面的代码没有:
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。我希望我的银行能这样计算我的账户余额。
谁能给我解释一下这是怎么回事?
非常感谢您的帮助!
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.