Может кто-то объяснять это:
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
.
При сравнении текста в Юникоде дефисы обрабатываются отдельно. При сравнении 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 ")
Хороший вопрос!
Покопавшись, я обнаружил, что проблема связана с дефисами и апострофами. Ваш пример демонстрирует такое же "странное" поведение с ''X'', как и с '-X'.
Я не могу приписать себе заслугу в поиске ответа, потому что он находится здесь: Сортировка SQL и дефисы