【问题标题】:1+1=3? Space characters in nvarchar variables and string lengths1+1=3? nvarchar 变量和字符串长度中的空格字符
【发布时间】:2019-08-07 09:00:02
【问题描述】:

我刚刚偶然发现了这个:

为什么下面的代码没有:

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。我希望我的银行可以这样计算我的账户余额。

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

非常感谢您的帮助!

【问题讨论】:

标签: sql-server tsql sql-server-2017 nvarchar


【解决方案1】:

LEN

返回指定字符串表达式的字符数, 不包括尾随空格

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

LEN 不包括尾随空格。如果这是一个问题,请考虑使用 DATALENGTH (Transact-SQL) 函数,它不会修剪字符串。如果 处理一个 unicode 字符串,DATALENGTH 将返回两倍的数字 字符数。

【讨论】:

  • "如果处理一个 unicode 字符串,DATALENGTH 将返回两倍的字符数。"这是不正确的。 DATALENGTH 返回变量中的八位字节(字节)数。在 SQL Server 上,nvarchar 是一个 UTF-16 字符串,由于代理和补充字符可能需要四个或更多字节来描述单个字符。参考:Surrogates and Supplementary Characters
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多