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