【问题标题】:Empty string variable matching to LIKE conditions in SQL与 SQL 中的 LIKE 条件匹配的空字符串变量
【发布时间】:2017-12-08 13:50:07
【问题描述】:

我有一个包含 nvarchar(max) 列的 SQL Server 表。我运行了一个查询来选择该列包含字符串“remove”的每一行。在结果中,我有几行在此列中填充了一个空字符串,我不明白为什么会返回这些值。

我试图进一步调查返回的空字符串值之一。我发现空字符串值将匹配某些LIKE 条件,但不匹配其他条件。例如,它会匹配到%remove%%x%,但不会匹配到%q%

在 SQL Server Management Studio 的结果网格中,nvarchar 字段显示为空字段(不为空)。但是,如果我将len() 函数应用于此字段,它会返回值 649。当我将结果表从 SQL Server Management Studio 导出到 Excel 时,nvarchar(max) 字段为空。

假设必须有一堆空白字符填充该字段,我尝试在将“x”连接到返回值的任一端后选择该字段。结果中,开头的“x”出现在字符串的开头,但不显示连接到结尾的“x”。

我完全不知道发生了什么。我可以根据要求提供更多信息。

select itemid, content
from objects
where itemid = 100 and content like '%remove%'

----------------


itemid  |  content
100     |  

select itemid, 'x' + content + 'x' as 'content'
from objects
where itemid = 100 and content like '%remove%'

----------------


itemid  |  content
100     |  x

编辑:

修剪字段不会改变字符数。但是,当我确实使用子字符串选择连接输出中的最后一个字符时,返回的字符是“x”,这表明由于字符串的长度,它在 GUI 输出中不可见。不过,在将内容导出到 Excel 时,我仍然看不到这个尾随的“x”字符。我认为 nvarchar 变量中可能存在不受支持的字符。


select itemid, 'x' + ltrim(rtrim(content)) + 'x' as 'content'
from objects
where itemid = 100 and content like '%remove%'

----------------


itemid  |  content
100     |  x

【问题讨论】:

  • 我无法重现,您真的在完全相同的条件下进行了测试吗?
  • can't reproduce this behavior。你能提供一个可重复的样品吗?
  • 你试过在你的领域使用 LTRIM() 吗?这将删除字符串左侧的所有前导空格。您还可以查看分析 LEN(LTRIM(RTRIM(content))) ,这将删除前导或尾随空格并为您提供长度。
  • 正如其他人所提到的,该列可能充满了空格(或其他不可显示的字符),而不是实际上是空的。很难看,但长度值是一个很大的赠品。根据您在 GUI 中显示该列的宽度,稍后在该字段中它包含您搜索的值可能并不明显。也许将结果粘贴到 Notepad++ 等文本编辑器中,您可以看到整个内容,并且您会很容易看到其中是否有空格、制表符等。
  • 您的第二个查询似乎有问题,特别是 'x' + content + 'x'。根据您的输出,结果是x。这不可能。 'x' + '' + 'x' 将导致 xx'x' + ' ' + 'x' 将导致 'x x'。最后,'x' + NULL + 'x' 将导致 NULL 我感觉其他 x 在您的输出中,但您在右侧的滚动不够。

标签: sql sql-server sql-like


【解决方案1】:

我的猜测是字符串中有一些控制字符。例如,如果第一个字符是换行符,则可能会导致其余字符不显示。

试试

select item_id, unicode(content) 
from objects
where item_id = 100;

这将显示第一个字符的 unicode 代码点,您可以看到第二个字符:

unicode(substring(item, 2, 1))

等等。

【讨论】:

  • 我认为您对造成这种情况的原因可能是正确的。我已经在返回的字符串值的每个字符上运行了 unicode 函数,它显示了从 0 到 121 的 unicode 值。我对 unicode 字符及其在这种情况下的兼容性知之甚少。我观察到的内容是否确认字符串中有不受支持的字符,还是需要我提供更多信息?
  • 查看 en.wikipedia.org/wiki/UTF-8utf8-chartable.de/unicode-utf8-table.plthedatastudio.net/character_encoding_profile.htm 以了解 Unicode 代码点是什么。较低的值(U+0000 到 U+001F)是控制字符,因此不可见,但会对显示造成严重破坏。
【解决方案2】:

我认为,你应该修剪柱子;

select itemid, LTRIM(RTRIM(content))
from objects
where itemid = 100 and content like '%remove%'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多