Если Вы не хотите, чтобы сервер выполнил любое преобразование наборов результатов, установите 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)
Оператор 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, эти два столбца определены эквивалентно:
CHAR(10) BINARY
CHAR(10) CHARACTER SET latin1 COLLATE latin1_bin
Эффект BINARY как атрибута столбца отличается от эффекта до MySQL 4.1. Прежде BINARY помечал столбец, который обрабатывался как двоичная строка, то есть строка байтов, которая не имеет никакого набора символов или объединения, что отличается от не двоичной символьной строки, которая имеет двоичное объединение. Для обоих типов строк сравнения основаны на числовых значениях строкового модуля, но для не двоичных строк, модулем является символ, и некоторые наборы символов позволяют многобайтовые символы.
Использование 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 collation_name;
Следующая таблица показывает возникающий в результате порядок значений, если мы используем ORDER BY с различными объединениями:
latin1_swedish_ci
latin1_german1_ci
latin1_german2_ci
Muffler
Muffler
M├╝ller
MX Systems
M├╝ller
Muffler
M├╝ller
MX Systems
MX Systems
MySQL
MySQL
MySQL
Символ, который вызывает различные порядки сортировки в этом примере: U с двумя точками сверху, который в Германии известен как U-umlaut.
Первый столбец показывает результат SELECT, использующего правило объединения Swedish/Finnish, которое говорит, что U-umlaut сортируется после Y.
Второй столбец показывает результат SELECT, использующего правило German DIN-1, которое говорит, что U-umlaut сортируется с U.
Третий столбец показывает результат SELECT, использующего правило German DIN-2 rule, которое говорит, что U-umlaut сортируется с UE.
10.6. Операции, на которые воздействует поддержка набора символов
Этот раздел описывает операции, которые берут во внимание информацию о наборе символов.
10.6.1. Строки результата
MySQL имеет много операторов и функций, которые возвращают строку. Этот раздел отвечает на вопрос: каков набор символов и объединение у такой строки?
Для простых функций, которые берут строку ввода и возвращают строковый результат как вывод, набор символов и объединение вывода такие же, как таковые у входного значения. Например, UPPER(X) возвращает строку, чья символьная строка и объединение являются такими же, как X. Это относится к INSTR(), LCASE(), LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), SUBSTRING(), TRIM(), UCASE() и UPPER().
Обратите внимание: функция REPLACE(), в отличие от всех других функций, всегда игнорирует объединение строкового ввода и выполняет чувствительное к регистру сравнение.
Если строковый ввод или функциональный результат является двоичной строкой, она не имеет никакого набора символов или объединения. Это может быть проверено, используя функции CHARSET() и COLLATION(), которые вернут binary, чтобы указать, что их параметр двоичная строка:
mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary | binary |
+---------------------+-----------------------+