【问题标题】:T-SQL Handling of White-Space空格的 T-SQL 处理
【发布时间】:2016-04-18 14:46:33
【问题描述】:

我有一个用户输入表单,由于我自己的愚蠢疏忽,它允许用户输入空字符串,以此来识别新数据集与哪组数据相关......

这导致使用空标识符或由多个“空格”字符组成的标识符记录多个数据集。这些对于用户来说是无法区分的,因为它们都只是显示为空,但是我不认为这是一个编程问题,因为字符串不同。

然而,当我尝试检索这些数据集时,我得到的所有数据集都只有空格作为标识符。

基本上可以将问题隔离如下,为什么这个查询会为每个 SELECT 生成 4 行结果,而不仅仅是实际匹配的结果?

DECLARE @testTable TABLE ([NumberOfSpaces] INT, [SpaceString] VARCHAR(50))

INSERT INTO @testTable ([NumberOfSpaces],[SpaceString]) VALUES
(0,''),
(1,' '),
(2,'  '),
(3,'   ')

SELECT * FROM @testTable WHERE [SpaceString] = ''
SELECT * FROM @testTable WHERE [SpaceString] = ' '
SELECT * FROM @testTable WHERE [SpaceString] = '  '
SELECT * FROM @testTable WHERE [SpaceString] = '   '

这更多是出于好奇,因为我的实际修复需要删除仅包含空格的标识符。

【问题讨论】:

  • HoneyBadger 上面的评论是我一直在寻找的答案 - 不幸的是,您无法将评论标记为答案..
  • 删除评论,替换为答案。

标签: sql sql-server whitespace


【解决方案1】:

据我了解,sql-server 在用于比较/连接等时会修剪所有尾随空格。这实际上是 ANSI 标准。更多信息here.

【讨论】:

    【解决方案2】:

    您可以在 where 子句中添加一个额外的谓词来检查 DATALENGTH。

    declare @SpaceString varchar(10) = '  '
    SELECT * 
    FROM @testTable 
    WHERE [SpaceString] = ''
    and DATALENGTH(SpaceString) = DATALENGTH(@SpaceString)
    

    当然,它变成了一个 nonSARGable 谓词,但您没有太多选择,因为该表允许此数据进入。这里要小心,因为 LEN 和 DATALENGTH 并不完全相同。 LEN 将忽略尾随空格,但 DATALENGTH 不会。

    【讨论】:

    • 对于未来的读者:同时注意比较 DATALENGTH(varchar)DATALENGTH(nvarchar)。与varchar 中的相同字符串相比,Unicode 字符串 (nvarchar) 需要两倍的字节数。所以DATALENGTH(N'test') / 2 = DATALENGTH('test').
    猜你喜欢
    • 2017-06-12
    • 2010-09-26
    • 1970-01-01
    • 2021-07-03
    • 2014-05-29
    • 2011-01-28
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多