在我的 SQL 表中,我的文本具有隐藏字符,只有在我将其复制并粘贴到记事本++中时才可见。
如何使用 SQL Server 查询找到那些具有隐藏字符的行?
我试过比较使用的长度datalength
,len
但没有用。
DATALENGTH(name) AS BinaryLength != LEN(name)
我想要有隐藏字符的行。
在我的 SQL 表中,我的文本具有隐藏字符,只有在我将其复制并粘贴到记事本++中时才可见。
如何使用 SQL Server 查询找到那些具有隐藏字符的行?
我试过比较使用的长度datalength
,len
但没有用。
DATALENGTH(name) AS BinaryLength != LEN(name)
我想要有隐藏字符的行。
假设这是由控制字符引起的。其中一些是不可见的。但也包括制表符、换行符和空格。一个示例来说明以及如何让它们出现。
--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 条件。因此只有他们被退回。在这种情况下,我的选择语句中只返回“错误”字符串。