SQL Сервер: оператор LIKE и юникод против запятой ascii - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь сопоставить шаблон на SQL сервере, и у меня странное поведение, которое я не могу объяснить.

Рассмотрим эти 2 запроса:

DECLARE @x NVARCHAR(500) = '123 B, Main Sreet';

SELECT @x;

SELECT IIF(@x NOT LIKE '%[^a-z0-9 ,--]%' ESCAPE '|', 'Pass', 'Fail');

Результат: Pass

Теперь, если я изменю переменную с NVARCHAR на VARCHAR, я получу это:

DECLARE @x VARCHAR(500) = '123 B, Main Sreet';

SELECT @x;

SELECT IIF(@x NOT LIKE '%[^a-z0-9 ,--]%' ESCAPE '|', 'Pass', 'Fail');

Результат: Fail

Не знаю думаю, что это проблема преобразования, так как состояние docs :

Когда все аргументы (match_expression, pattern и escape_character, если имеются) являются символьными типами данных ASCII, сопоставление с шаблоном ASCII выполнила. Если какой-либо из аргументов относится к типу данных Unicode, все аргументы преобразуются в Unicode, и выполняется сопоставление с шаблоном Unicode.

Я также заметил, что оба приведенных выше запроса приводят к «Pass», когда вы удалите один из дефисов как для версии NVARCHAR, так и для версии VARCHAR, что является ожидаемым результатом. Итак, моя теория заключается в том, что двойные дефисы создают диапазон символов между запятой и дефисом. Однако, если это действительно так, то мне все же это кажется странным, поскольку они имеют одинаковую позицию в ASCII и Unicode. Кроме того, если бы это был диапазон, он все равно должен совпадать на запятой, он не исключает его исключение.

ОБНОВЛЕНИЕ

Второй «дефис» на самом деле ASCII 150 или Unicode 8211, длинный дефис. Вероятно, это не соответствовало примеру, потому что я набрал его, а не скопировал и вставил (vm probs). Таким образом, моя теория состоит в том, что в нем говорится о совпадении между запятой (ASCII 44) и длинным дефисом (ASCII 150 / Unicode 8211), а не о совпадении на запятой, дефисе и длинном дефисе.

Проблема в том, что если я вставлю запятую в переменную для проверки, это приведет к сбою, который не имеет смысла, если он конвертируется в Unicode и затем ищет Unicode 44 - Unicode 8211. в конце дня он все еще должен видеть запятую, если это действительно диапазон.

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