2016-12-29 3 views
2

Я перехожу из SybaseIQ в SQL Server 2008, один главный наблюдатель различий находится в предложении ORDER BY. Созданный на столе, как create table test(name varchar(20))Как управлять порядком на SQL-сервере по сравнению с Sybase?

вставили несколько записей:

insert into test values('Hi') 
insert into test values('Toi') 
insert into test values('>Toi') 
insert into test values('iHh') 
insert into test values('hi') 
insert into test values('IhH') 
insert into test values('1Hi') 
insert into test values('2Hi') 

Выполняемые операции выбора как на SQL Server и Sybase, как:

select * from test order by name desc 

Результат для Sybase является:

name  
------- 
iHh  
hi  
Toi  
IhH  
Hi  
>Toi  
2Hi  
1Hi 

И результат для SQL-сервера:

name  
------- 
Toi  
IhH  
iHh  
Hi  
hi  
2Hi  
1Hi  
>Toi 

Почему этот порядок отличается от SQL-сервера и Sybase? Как управлять порядком на SQL-сервере по сравнению с Sybase для получения того же результата?

ответ

1

Вы можете использовать сортировку Latin1_General_BIN2 в качестве сравнения по умолчанию SQL Server или использовать задание для задания ORDER.

двоичной сортировки

двоичных данных сортировки сортировки, основанные на последовательности кодированных значений, которые определены в локализации и типа данных. Это с учетом регистра. Бинарная сортировка в SQL Server определяет локаль и кодовую страницу ANSI, которая будет использоваться. Это обеспечивает двоичный порядок . Поскольку они относительно просты, двоичные сопоставления помогают улучшить производительность приложений. Для типов данных, отличных от Юникода, данные сравнения основаны на кодовых точках, которые определены на кодовой странице ANSI . Для типов данных Unicode сопоставление данных основано на кодовых точках Unicode . Для двоичных сопоставлений по типам данных Unicode локаль не учитывается в сортировках данных. Например, Latin_1_General_BIN и Japanese_BIN дают идентичные результаты сортировки , когда они используются в данных Unicode.

Существует два типа двоичных сопоставлений в SQL Server; более старые сопоставления BIN и новые сопоставления BIN2 . В сопоставлении BIN2 все символы сортируются в соответствии с их кодовыми точками. В сопоставлении BIN только первый символ: , отсортированный в соответствии с кодовой точкой, а остальные символы: , отсортированные в соответствии с их байтовыми значениями. (Поскольку платформа Intel является немного архитектуры обратного порядка байт, символы коды Unicode всегда хранятся байты-местами.)

declare @Test table (name varchar(20) collate Latin1_General_BIN2) 
insert @Test values ('Hi'), ('Toi'), ('>Toi'), ('iHh'), ('hi'), ('IhH'), ('1Hi'), ('2Hi') 

select * from @Test order by name desc 

Или просто

select * from @Test order by name collate Latin1_General_BIN2 desc 
+0

Текущая база данных collate - это 'SQL_Latin1_General_CP1_CS_AS', чувствительность к регистру и чувствительность к акценту, требуемая для другого запроса базы данных. – Pravin

+0

@Pravin. Вы можете использовать заданное сопоставление для предложения ORDER – Eric

0

Использования ASCII Значение для столбца и заказать его в по убыванию заказать.ASCII закажет свой первый более позднюю слова, то вы можете подать заказ на вашей колонке

SELECT Name FROM @tblTest ORDER BY ASCII(Name) desc,Name 

выход в убывающем:

enter image description here

Выход в Восходящая:

enter image description here

+2

Порядок сортировки не может быть определен с помощью' ASCII' правильно, так как он просто возвращает код слева знак – Eric

+0

он работает для требования op, как я протестировал в своей системе, поэтому я даю ответ –

+0

@ Эрик, я обновил ответ, пожалуйста, проверьте его –

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