Странная разница в сопоставлении SQL Server 2005 между varchar () и nvarchar () - PullRequest
5 голосов
/ 17 июня 2010

Может кто-нибудь объяснить, пожалуйста:

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() и получили тот же результат.)

Параметр сортировки для базы данных: SQL_Latin1_General_CP1_CI_AS.

Ответы [ 2 ]

9 голосов
/ 17 июня 2010

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

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

Из MSDN

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

SELCT body From MSDN_Articles WHERE url IN ("http://support.microsoft.com/kb/322112")

1 голос
/ 17 июня 2010

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

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

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

...