0

在我的 SQL 表中,我的文本具有隐藏字符,只有在我将其复制并粘贴到记事本++中时才可见。

如何使用 SQL Server 查询找到那些具有隐藏字符的行?

我试过比较使用的长度datalengthlen 但没有用。

DATALENGTH(name) AS BinaryLength != LEN(name)

我想要有隐藏字符的行。

4

1 回答 1

0

假设这是由控制字符引起的。其中一些是不可见的。但也包括制表符、换行符和空格。一个示例来说明以及如何让它们出现。

--DROP TABLE #SillyTemp

DECLARE @InvisibleChar1 NCHAR(1) = NCHAR(28), @InvisibleChar2 NCHAR(1) = NCHAR(30), @NonControlChar NCHAR(1) = NCHAR(33);
DECLARE @InputString NVARCHAR(500) = N'Some |' + @InvisibleChar1 +'| random string |' + @InvisibleChar2 + '|' + '; Thank god Finally a normal character |' + @NonControlChar + '|'; 
SELECT @InputString AS OhNoInvisibleCharacters

DECLARE @ControlCharRange NVARCHAR(50) = N'%[' + NCHAR(1) + '-' + NCHAR(31) + ']%';

CREATE TABLE #SillyTemp
(
    input nvarchar(500)
)

INSERT INTO #SillyTemp(input)
VALUES (@InputString),(N'A normal string')

SELECT @ControlCharRange;
SELECT input FROM #SillyTemp AS #SI WHERE input LIKE @ControlCharRange;

这会产生 3 个结果。一个带有 invisiblechars 的字符串,如下所示:

一些|| 随机字符串 ||; 感谢上帝终于有一个正常的字符了|!|

请注意,它们实际上在 SQL 中是不可见的。但是stackoverflow这样显示它们。SQL Server 中的输出很简单。

一些|| 随机字符串 ||; 感谢上帝终于有一个正常的字符了|!|

但是这些字符仍然有一个对应的 (N)CHAR(X) 值。(N)CHAR(0) 是一个 NULL 字符,极不可能出现在字符串中,在我检测它们的设置中,它也为构建范围提供了一些问题。(N)CHAR(32) 是 ' ' 空格字符。

[XY] 字符串运算符的工作方式也基于 (N)CHAR 数字。因此我们可以设定 [NCHAR(1)-NCHAR(31)] 的范围

最后一个选择通过临时表,其中包含不可见字符。由于我们正在寻找 1 到 31 之间的任何 NCHARS,因此只有那些具有不可见字符(通常是无效字符或制表符/换行符)的 NCHARS 满足 where 条件。因此只有他们被退回。在这种情况下,我的选择语句中只返回“错误”字符串。

于 2019-10-23T13:57:55.250 回答