Правила сравнения и сортировки двоичных данных в 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, где байтовый тип рассматривается как знаковое значение.
Есть ли у вас ссылки на официальную документацию? – Seldon
Нет официальной документации по этому поведению, о котором я знаю. Я думаю, что правила для сравнения массивов примитивных байтов хорошо известны, поэтому они не описаны в документации SQL. –
Когда вы говорите «каждый байт, слева направо», вы имеете в виду использование подписанных или неподписанных байтовых сравнений? – Archie