Определить скрытых персонажей - PullRequest
0 голосов
/ 23 октября 2019

В моих таблицах SQL у меня есть текст со скрытыми символами, который виден только когда я копирую и вставляю его в notepad ++.

Как найти те строки, в которых есть скрытые символы с помощью запросов SQL Server?

Я попытался сравнить длины, используя datalength и len, это не сработало.

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

Я хочу строку, в которой есть скрытые символы.

1 Ответ

0 голосов
/ 23 октября 2019

Предполагается, что это вызвано управляющими символами. Некоторые из которых невидимы. Но также включают вкладки, новые строки и пробелы. Пример для иллюстрации и как заставить их появляться.

--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 результата. Строка с невидимыми символами внутри них, например:

Некоторые ||случайная строка ||;Слава богу, наконец, нормальный символ |! |

Обратите внимание, что на самом деле они невидимы внутри SQL. Но stackoverflow показывает их как таковые. Выходные данные в SQL Server просто.

Некоторые ||случайная строка ||;Слава богу, наконец, нормальный символ |! |

Но эти символы по-прежнему имеют соответствующее значение (N) CHAR (X). (N) CHAR (0) является символом NULL и очень маловероятно, что он будет в строке, в моей настройке, чтобы обнаружить их, он также создает некоторые проблемы при построении диапазона. (N) CHAR (32) - это символ пробела.

Принцип работы строкового оператора [XY] также основан на (N) числах CHAR. Поэтому мы можем сделать диапазон [NCHAR (1) -NCHAR (31)]

Последний выбор проходит через временную таблицу, в которой есть невидимые символы. Так как мы ищем любые NCHARS между 1 и 31, только условия с невидимыми символами (и часто недопустимыми символами или символами табуляции / перевода строки) удовлетворяют условию where. Таким образом, только они возвращаются. В этом случае в моем операторе select возвращается только «неисправная» строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...