2014-11-20 2 views
3

Я использую SQL Server 2012, и у меня есть база данных с SQL_Latin1_General_CP1_CI_AS комплектовке:SQL порядок сервер СНП не соответствует ASCII код заказа

create table testtable (c nvarchar(1) null) 

insert into testtable (c) values('8') 
insert into testtable (c) values('9') 
insert into testtable (c) values(':') 
insert into testtable (c) values(';') 

select c, ASCII(c) ascvalue 
from testtable 
order by c 

я получаю этот выход:

c | ascvalue 
------------ 
: | 58 
; | 59 
8 | 56 
9 | 57 

Почему SQL Server сортирует порядок, противоположный порядку кода ascii?

ответ

3

Thanks Ross et al! Найдена следующая документация, которая имеет отличное объяснение для сортировки MS SQL Server, подумал, что я разместил ее здесь, чтобы помочь тем, кто сталкивается с этим вопросом или связанными с ним вопросами.


Collation Параметры сортировки определяет битовые шаблоны, которые представляют каждый символ в наборе данных. Колликации также определяют правила сортировки и сравнения данных. SQL Server поддерживает хранение объектов, которые имеют разные сортировки в одной базе данных. Для столбцов, отличных от Unicode, параметр сопоставления указывает кодовую страницу для данных и какие символы могут быть представлены. Данные, которые перемещаются между столбцами, отличными от Unicode, должны быть преобразованы со страницы исходного кода на кодовую страницу назначения.

Более подробно прочитать здесь http://goo.gl/RpBGWN


Из моего фрагмента кода, если бы я хотел, чтобы отсортировать значения в двоичном порядке, запрос может быть изменено на следующее: select c, ASCII(c) ascvalue from testtable order by c collate Latin1_General_BIN

Или изменить параметры сортировки определение при создании таблицы create table testtable (c nvarchar(1) collate Latin1_General_BIN null)

Который дает следующий результат:

 
c | ascvalue 
------------ 
8 | 56 
9 | 57 
: | 58 
; | 59 
+0

Еще один комментарий: сопоставления придерживаются отдельных столбцов, а не только всей таблицы или базы данных. –

+0

Коллажи могут даже быть вынуждены в отдельных выражениях сравнения, не придерживаясь чего-либо еще. –

4

Сортировка не является BINARY. Это CI нечувствительный к регистру, поэтому он будет складывать символы верхнего и нижнего регистра, чтобы отсортировать их. Он определяет порядок сортировки знаков пунктуации и цифр не-ASCII образом, как вы обнаружили. Это сортировка SQL, выполняющая то, что выполняет SQL-сортировка: определите порядок сортировки в соответствии с некоторыми конкретными правилами.

+0

См http://stackoverflow.com/a/361059/14731 информацию о том, как пунктуация получает лечение по-разному. – Gili

1

Если вы хотите, чтобы сортировать быть в ASCII value каждого символа, то вы должны отметить, что явно в Order by положение.

select c, ASCII(c) ascvalue from #testtable order by ASCII(c) 

еще SQL_Latin1_General_CP1_CI_AS

говорит нам, что поддерживаемый язык английский.

Там нет BIN во имя сортировки, что означает, что он поддерживает словарь сортировки

в словаре сортировка; сравнение символьных данных основано на порядке словаря ('A' и 'a' < 'B' и 'b').

словарь порядок по умолчанию, когда никакой другой порядок не определен явно

CI означает, символьные данные чувствительны к регистру (это значит «ABC» = «ABC»).

AS означает, что персональные данные чувствительны к акценту ('à' <> 'ä').

Смежные вопросы