MySQL: руководство профессионала
Шрифт:
Установка collation_connection также устанавливает character_set_connection к набору символов, связанному с объединением (эквивалент выполнения SET character_set_connection = @@character_set_database).
Когда пользователь соединяется, он посылает серверу имя набора символов, который требуется использовать. Сервер использует имя, чтобы установить переменные системы character_set_client, character_set_results и character_set_connection. В действительности сервер
С клиентом mysql нет необходимости выполнять SET NAMES каждый раз при запуске, если Вы хотите использовать набор символов, отличный от значения по умолчанию. Вы можете добавить опцию --default-character-set в операторной строке mysql или в Вашем файле опций. Например, следующий файл опций, устанавливает изменения трех переменных наборов символов к koi8r каждый раз, когда Вы вызываете mysql:
[mysql]
default-character-set=koi8r
Если Вы используете клиент mysql с поддержкой реконнекта (что вообще-то не рекомендуется), предпочтительно использовать команду charset, а не SET NAMES. Например:
mysql> charset utf8
Charset changed
Команда charset выдает инструкцию SET NAMES, а также изменяет заданный по умолчанию набор символов, который используется, если mysql повторно соединяется после того, как подключение прервалось.
Пример: Предположите, что column1 определен как CHAR(5) CHARACTER SET latin2. Если Вы не говорите SET NAMES или SET CHARACTER SET, то для then for SELECT column1 FROM t сервер посылает обратно все значения column1, использующий набор символов, который пользователь определил, когда соединялся. С другой стороны, если Вы говорите SET NAMES 'latin1' или SET CHARACTER SET latin1 перед выдачей инструкции SELECT, сервер преобразовывает значения latin2 в latin1 только перед посылкой результатов обратно. Преобразование может быть с потерями, если имеются символы, которые не представлены в обоих наборах символов.
Если Вы не хотите, чтобы сервер выполнил любое преобразование наборов результатов, установите character_set_results в NULL:
SET character_set_results = NULL;
Обратите внимание: в настоящее время UCS-2 не может использоваться как набор символов пользователя, это означает, что SET NAMES 'ucs2' не работает.
Чтобы видеть значения переменных системы набора символов и объединения, которые обращаются к Вашему подключению, используйте эти инструкции:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
10.5. Проблемы
Следующие разделы излагают различные аспекты объединений набора символов.
10.5.1. Использование COLLATE в SQL-инструкциях
С предложением COLLATE Вы можете отменять любое заданное по умолчанию объединение для сравнения. COLLATE может использоваться в различных частях инструкций SQL. Имеются некоторые примеры:
С ORDER BY:
SELECT k FROM t1 ORDER BY k COLLATE latin1_german2_ci;
С AS:
SELECT k COLLATE latin1_german2_ci AS k1 FROM t1 ORDER BY k1;
С GROUP BY:
SELECT k FROM t1 GROUP BY k COLLATE latin1_german2_ci;
С агрегатными функциями:
SELECT MAX(k COLLATE latin1_german2_ci) FROM t1;
С DISTINCT:
SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1;
С WHERE:
SELECT * FROM t1 WHERE _latin1 'M+ller' COLLATE latin1_german2_ci = k;
SELECT * FROM t1 WHERE k LIKE _latin1 'M+ller' COLLATE latin1_german2_ci;
С HAVING:
SELECT k FROM t1 GROUP BY k
HAVING k = _latin1 'M+ller' COLLATE latin1_german2_ci;
10.5.2. Старшинство предложения COLLATE
Предложение COLLATE имеет высокое старшинство (выше, чем ||), так следующие два выражения эквивалентны:
x || y COLLATE z
x || (y COLLATE z)
10.5.3. Оператор BINARY
Оператор BINARY приводит строку после него к двоичной строке. Это простой способ вынудить сравнение быть выполненным байт в байт, а не символ в символ. BINARY также заставляет конечные пробелы быть значительными.
mysql> SELECT 'a' = 'A';
– > 1
mysql> SELECT BINARY 'a' = 'A';
– > 0
mysql> SELECT 'a' = 'a ';
– > 1
mysql> SELECT BINARY 'a' = 'a ';
– > 0
BINARY str сокращение для CAST(str AS BINARY).
Атрибут BINARY на символьных определениях столбца имеет различный эффект. Символьному столбцу, определенному с атрибутом BINARY, назначено двоичное объединение набора символов столбца. Каждый набор символов имеет двоичное объединение. Например, двоичное объединение для набора символов latin1: latin1_bin, так что, если набор символов по умолчанию таблицы latin1, эти два столбца определены эквивалентно: