SQL-подобное выражение не может найти символ пробела (Zero-Width-Non-Joiner (ZWNJ)) - PullRequest
2 голосов
/ 31 октября 2011

В приведенном ниже коде я хочу выбрать токен, где этот токен содержит символ пробела.

  Select *  from
     (select token = 'aaa‏‏sss') as dd
  where token like '%‏‏%'

положительный ответ:

    aaa‏‏sss

выходной ответ:

   null

примечание: этот символ является персидским и не отображается с видимой отметкой.Но этот символ отдельной строкой с двух сторон сам по себе.например: токен بهترین с полупространством равен بهت‌رین

Ответы [ 3 ]

2 голосов
/ 01 ноября 2011

Я думаю, что проблема в сопоставлении.

Например, этот запрос:

select PATINDEX('%‏‏%','aaa‏‏sss' collate  Arabic_CI_AS)

Возврат 1, но этот:

select PATINDEX('%‏‏%','aaa‏‏sss' collate  SQL_Latin1_General_CP1_CI_AS)

возврат 4; и это правильная позиция символа пробела во входной строке.

screenshot

Для этого вы должны изменить Collation вашей входной строки на некоторое латинское Collation, например: SQL_Latin1_General_CP1_CI_AS

2 голосов
/ 31 октября 2011

Чтобы узнать конкретное значение для использования, потребовалось бы знание типа данных базового столбца: VARCHAR или NVARCHAR?
Кроме того, в первом случае вам потребуется знать кодовую страницу , используемую для этой базы данных.

Как правило, вам нужно использовать escape-последовательность, например,

'abc\x008Adef' где \ x008A - это соответствующий код для полупространства в этой базовой системе кодирования.
Это значение, скорее всего, будет между 0x0080 и 0x00FF в настройке кодовой страницы, и может быть что-то вроде 0x2000 в Unicode.
Фактически, если вы используете строки Unicode, вам нужно будет опустить 'x' в escape-последовательности и просто использовать что-то вроде
N'abc\2000def' (опять же, предполагая, что гекс 2000 фактически является тем полупространством, которое вы имеете в виду.)

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

0 голосов
/ 01 ноября 2011

Я нахожу решение этой проблемы. Если мы поместим символ 'N' перед строкой шаблона, ответ будет исправлен. Символ N означает, что строка после него - Unicode. Исправленный код:

  Select *  from
     (select token = 'aaa‏‏sss') as dd
  where token like N'%‏‏%'
...