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

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

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

в решении SQL2000 автор продемонстрировал два варианта, один из которых использует и возвращает varchar, а другой varbinary. Автор объясняет Что он делает это без объяснения причин.

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

Я опустил публикацию кода, как его наиболее элегантно резюмировал в приведенной выше статье.

2 ответов


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

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

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


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

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

 WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_ci 

но это побеждает любой индекс, который вы можете иметь.

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

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

*** кстати, набор символов, набор символов и кодировок. Параметры сортировки-это набор правил для сравнения символов в наборе символов https://dev.mysql.com/doc/refman/5.7/en/charset-general.html

но, если вы выбираете однобайтовый набор символов (например, 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.