В чем преимущество использования varbinary над varchar здесь?

Некоторое время назад я задал вопрос о сортировке номера иерархии/версии в SQL Server. ( Как я могу сортировать колонку "Номер версии" в общем случае с помощью запроса SQL Server).

Среди ответов, которые были представлены, была эта ссылка на вызов кодирования TSQL с такой же загадкой.

В решении SQL2000 автор продемонстрировал два варианта: один использует и возвращает varchar и другую varbinary. Автор объясняет, что он делает это, не объясняя ПОЧЕМУ.

Итак, мой вопрос в самом деле, какие основные отличия/преимущества (если есть) различия в подходе? То есть зачем использовать varbinary вместо varchar?

Я пропустил отправку кода, как наиболее изящно изложенный в этой статье.

Ответ 1

Я считаю, что ожидание состоит в том, что данные varbinary обычно будут потреблять меньше байтов (5), чем varchar one (10 или 11, я думаю) на часть исходной строки, и поэтому для очень большого количества компонентов, или сравнения, это должно быть более эффективным.

Но я бы рекомендовал, чтобы если вы хотели использовать любое решение, которое вы реализуете как (они довольно короткие), так и попробуйте профилировать ваши реальные данные (и шаблоны запросов), чтобы увидеть, есть ли практические (я бы так не ожидал).

(Crafty Steal): И, как указывает Мартин, бинарные сравнения будут более эффективными, так как он не будет включать весь код, который должен иметь дело с сортировками.: -)

Ответ 2

Если мы используем varchar для хранения строк и используем различную сортировку для разных столбцов varchar, тогда мы можем получить ошибку "Недопустимое сочетание сортировок" в запросе Sql. (Например, если мы хотим сравнить две строки несовместимого сортировки или попытаться выбрать данные различной сортировки в комбинированный столбец).

Но это может быть исправлено, если мы укажем "COLLATE" в запросе. Для примера:

 WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs . 

Но это победит любой ИНДЕКС, который у вас может быть.

Чтобы предотвратить ошибки "Недопустимое сочетание коллажаций", мы можем использовать varbinary.

varbinary использует меньше места, чем varchar, если для столбца varchar используется многобайтовая сортировка. (двоичные строки не имеют наборов символов и коллабораций. Двоичные строки - это просто последовательность байтовых значений).

Но, если вы выберете однобайтовый набор символов (например, latin1) вместо многобайтового набора символов (например, utf8 или ucs2), тогда требования к пространству как для varbinary, так и для varchar одинаковы.

VARBINARY лучше, чем VARCHAR, если проверка достоверности не выполняется. Например, если набор символов по умолчанию - UTF8, это незаконно:

CREATE TABLE t9 (s1 VARCHAR(5));
INSERT INTO t9 VALUES (0xF4808283);

Но это законно, потому что набор символов не имеет значения:

CREATE TABLE t10 (s1 VARBINARY(5));
INSERT INTO t10 VALUES (0xF4808283);

Итак, VARCHAR сравнивает символы, используя байты сравнения "сортировка" и "VARBINARY". Большинство коллизий "нечувствительны к регистру", поэтому верхний регистр и регистр нижних регистров считаются равными. Поскольку varbinary не использует никакой сортировки, операции поиска всегда чувствительны к регистру в случае varbinary.