2014-10-08 6 views
2

Так что я могу ORDER BY над столбцом varbinary в MS SQL Server. Интересно, что это за алгоритм. Мне не удалось найти официальную документацию о том, как данные varbinary сравниваются в SQL Server. Я могу угадать правила, которые он использует, экспериментируя, но я не хочу основывать свои решения на догадках.Как сортировать данные varbinary

Значит, кто-нибудь знает какие-либо подробности по этому вопросу?

ответ

1

Правила сравнения и сортировки двоичных данных в SQL Server в основном такие же, как сравнение байтовых массивов вообще (каждый байт, слева направо). Одна разница в SQL Server - это понятие значения NULL, которое приводит к неизвестному результату сравнения и приводит к сортировке значений NULL до значений, отличных от NULL.

UPDATE:

Кроме того, SQL Server игнорирует конечный двоичные нули в двоичном сравнении строк.

Согласно this Connect feedback item, SQL Server придерживается стандарта ANSI SQL при сравнении двоичных строк. Ниже приведен соответствующий комментарий Microsoft о поведении.

Поведение на самом деле по дизайну, и мы следуем спецификации ANSI SQL . См правила ниже от последней спецификации (5c в частности):

5) Сравнение двух двоичных строковых значений X и Y, ни один из которых представляет собой большой двоичный объект значения строки, определяется следующим образом:

a) Пусть Lx - длина в октетах X и пусть Ly - длина в октетах . Пусть Xi, 1 (один) ≤ i ≤ Lx, - значение i-го октета X и пусть Yi, 1 (один) ≤ i ≤ Ly, - значение i-го октета Y.

b) Если Lx = Ly и Xi = Yi, 1 (один) ≤ i ≤ Lx, то X равно Y.

с) если лк < Ли, Xi = Yi для всех г ≤ Lx, и самый правый Ly - Lx октета Y все x'00, а затем она реализации- определено ли Х равно Y, или X меньше, чем Y.

г) Если Lx < ли, Xi = Yi для всех г ≤ Lx, и по меньшей мере один из самый правый Ly - Lx октета Y не X'00 », то Х меньше, чем Y.

е) Если Xj < Yj для некоторого у, 0 (ноль) < J ≤ минимальная (Lx, Ly), и Xi = Yi для всех я < J, то X меньше Y.

В принципе, стандарт оставляет его до реализации для обработки строк, которые отличаются только на 00 как равные или меньшие. Мы рассматриваем его как равные.

Я хочу добавить, что байтом здесь является 8-битное неподписанное исходное значение, похожее на тип байта в .NET. Это отличается от Java, где байтовый тип рассматривается как знаковое значение.

+0

Есть ли у вас ссылки на официальную документацию? – Seldon

+0

Нет официальной документации по этому поведению, о котором я знаю. Я думаю, что правила для сравнения массивов примитивных байтов хорошо известны, поэтому они не описаны в документации SQL. –

+0

Когда вы говорите «каждый байт, слева направо», вы имеете в виду использование подписанных или неподписанных байтовых сравнений? – Archie

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