Использование CHARACTER SET binary на определении столбца CHAR, VARCHAR или TEXT заставляет столбец обрабатываться как двоичный тип данных. Например, следующие пары определений эквивалентны:
CHAR(10) CHARACTER SET binary
BINARY(10)
VARCHAR(10) CHARACTER SET binary
VARBINARY(10)
TEXT CHARACTER SET binary
BLOB
10.5.4. Некоторые специальные случаи, где определение объединения сложно
В большинстве инструкций, очевидно, какое объединение MySQL использует, чтобы решить операцию сравнения. Например, в следующих случаях, должно быть четко ясно, что объединением будет объединение столбца x:
SELECT x FROM T ORDER BY x;
SELECT x FROM T WHERE x = x;
SELECT DISTINCT x FROM T;
Однако, когда включаются многократные операнды, может иметься неоднозначность. Например:
SELECT x FROM T WHERE x = 'Y';
Это должно использовать объединение из столбца x или от литерала строки 'Y'?
Стандарт SQL решает такие вопросы, применяя правило coercibility. В основном это означает: раз x и 'Y' имеют объединения, которое объединение имеет приоритет? Это может быть трудно решить, но следующие правила покрывают большинство ситуаций:
Явное предложение COLLATE имеет 0 (не имеет coercible вообще).
Конкатенация двух строк с различными объединениями имеет coercibility 1.
Объединение столбца, сохраненного стандартного параметра или локальной переменной имеет coercibility 2.
Константа системы (строка, возвращенная функциями типа USER() или VERSION()) имеет coercibility 3.
Объединение литерала имеет coercibility 4.
NULL или выражение, которое получено из NULL, имеет coercibility 5.
Предшествующие значения coercibility текущие для MySQL 5.1.
Эти правила решают неоднозначности следующим способом:
Используют объединение с самым низким значение coercibility.
Если обе стороны имеют тот же самый coercibility, то это ошибка, если объединения не те же самые.
Пример:
column1 = 'A'
Использует объединение column1
column1 = 'A' COLLATE x
Использует объединение 'A' COLLATE x
column1 COLLATE x = 'A' COLLATE y
Ошибка
Функция COERCIBILITY() может использоваться, чтобы определить coercibility строкового выражения:
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
– > 0
mysql> SELECT COERCIBILITY(VERSION());
– > 3
mysql> SELECT COERCIBILITY('A');
– > 4
10.5.5. Объединения должны быть для правильного набора символов
Каждый набор символов имеет одно или большее количество объединений, но каждое объединение связано с одним и только одним набором символов. Следовательно, следующая инструкция вызывает сообщение об ошибке, потому что объединение latin2_bin не допустимо с набором символов latin1:
mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1253 (42000): COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'
10.5.6. Пример эффекта объединения
Предположите, что столбец X в таблице T имеет эти значения столбца latin1:
Muffler
M+-ller
MX Systems
MySQL
Предположите также, что значения столбца получены, используя следующую инструкцию:
SELECT X FROM T ORDER BY X COLLATE