Странное различие в Сопоставлении SQL Server 2005 года между varchar () и nvarchar ()

Может кто-то объяснять это:

SELECT 
  CASE WHEN CAST('iX' AS nvarchar(20)) 
      > CAST('-X' AS nvarchar(20)) THEN 1 ELSE 0 END,
  CASE WHEN CAST('iX' AS varchar(20)) 
      > CAST('-X' AS varchar(20)) THEN 1 ELSE 0 END

Результаты: 0 1

SELECT 
  CASE WHEN CAST('i' AS nvarchar(20)) 
      > CAST('-' AS nvarchar(20)) THEN 1 ELSE 0 END,
  CASE WHEN CAST('i' AS varchar(20)) 
      > CAST('-' AS varchar(20)) THEN 1 ELSE 0 END

Результаты: 1 1

На первом запросе, nvarchar() результат не то, что я ожидаю и все же удаляю X сделайте nvarchar() вид происходит как ожидалось.

(Мои исходные запросы, используемые '' и N'' литеральный синтаксис для различения varchar() и nvarchar() вместо CAST() и получил тот же результат.)

Установка Collation для базы данных SQL_Latin1_General_CP1_CI_AS.

5
задан marc_s 23 June 2010 в 20:38
поделиться

2 ответа

При сравнении текста в Юникоде дефисы обрабатываются отдельно. При сравнении Unicode используется «порядок словаря», который игнорирует дефисы. Это не относится к сравнению текста, отличного от Unicode.

Сравнение -X и iX похоже на сравнение X и iX , поэтому -X , левая сторона больше. При сравнении «-» и «i» это похоже на сравнение «» и «i», поэтому «i» правая часть больше.

Из MSDN,

Правила сортировки SQL для сортировки данные не в Юникоде несовместимы с любая процедура сортировки, предоставляемая операционная система Microsoft Windows система; однако сортировка Данные Unicode совместимы с конкретная версия Windows правила сортировки. Потому что сравнение правила для данных не в Юникоде и Юникоде разные, когда вы используете SQL сопоставление вы можете увидеть другое результаты для сравнения одинаковых персонажей, в зависимости от базовый тип данных. Например, если вы используете сортировку SQL "SQL_Latin1_General_CP1_CI_AS", не-Unicode строка 'a-c' меньше, чем строка 'ab', потому что дефис ("-") сортируется как отдельный символ, который стоит перед "b". Однако, если вы конвертируете эти строки в Unicode, и вы выполняете то же самое сравнение, строка Unicode N'a-c ' считается больше, чем N'ab ' потому что правила сортировки Unicode используют "сортировка слов", игнорирующая дефис.

Тело SELCT из MSDN_Articles, ГДЕ url IN (" http://support.microsoft.com/kb/322112 ")

9
ответ дан 13 December 2019 в 22:01
поделиться

Хороший вопрос!

Покопавшись, я обнаружил, что проблема связана с дефисами и апострофами. Ваш пример демонстрирует такое же "странное" поведение с ''X'', как и с '-X'.

Я не могу приписать себе заслугу в поиске ответа, потому что он находится здесь: Сортировка SQL и дефисы

1
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: