В чем преимущество использования varbinary перед varchar? - PullRequest
19 голосов
/ 12 мая 2011

Некоторое время назад я задал вопрос о сортировке по иерархии / номеру версии в SQL Server. ( Как можно отсортировать столбец «Номер версии» в общем, используя SQL Server Query ).

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 12 мая 2011

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

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

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

4 голосов
/ 27 января 2018

Если мы используем разные параметры сортировки для разных столбцов 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.

...