MySQL: руководство профессионала
Шрифт:
10.3.6. Национальный набор символов
Стандарт SQL определяет NCHAR или NATIONAL CHAR как способ указать, что столбец CHAR должен использовать некоторый предопределенный набор символов. MySQL 5.1 использует utf8 как этот предопределенный набор символов. Например, эти объявления типа данных эквивалентны:
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)
Эти тоже взаимозаменяемы:
VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)
Вы
SELECT N'some text';
SELECT _utf8'some text';
10.3.7. Примеры назначения набора символов и объединения
Следующие примеры показывают, как MySQL определяет заданные по умолчанию набор символов и объединение.
Пример 1: определение таблицы и столбца
CREATE TABLE t1 (c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci)
DEFAULT CHARACTER SET latin2
COLLATE latin2_bin;
Здесь мы имеем столбец с набором символов latin1 и объединением latin1_german1_ci. Определение явно, так что это просто. Обратите внимание, что не имеется никакой проблемы с сохранением столбца latin1 в таблице latin2.
Пример 2: определение таблицы и столбца
CREATE TABLE t1 (c1 CHAR(10) CHARACTER SET latin1)
DEFAULT CHARACTER SET latin1
COLLATE latin1_danish_ci;
На сей раз мы имеем столбец с набором символов latin1 и заданным по умолчанию объединением. Хотя это могло бы показаться естественным, заданное по умолчанию объединение не принимается из уровня таблицы. Вместо этого, поскольку заданное по умолчанию объединение для latin1 обязательно latin1_swedish_ci, столбец c1 имеет объединение latin1_swedish_ci (не latin1_danish_ci).
Пример 3: определение таблицы и столбца
CREATE TABLE t1 (c1 CHAR(10))
DEFAULT CHARACTER SET latin1
COLLATE latin1_danish_ci;
Мы имеем столбец с заданными по умолчанию набором символов и объединением. В этой ситуации MySQL проверяет уровень таблицы, чтобы определить набор символов столбца и объединение. Следовательно, набор символов для столбца c1 latin1 и объединение latin1_danish_ci.
Пример 4: определение базы данных, таблицы и столбца
CREATE DATABASE d1 DEFAULT CHARACTER SET latin2
COLLATE latin2_czech_ci; USE d1;
CREATE TABLE t1 (c1 CHAR(10));
Мы создаем столбец без того, чтобы определить набор символов и объединение. Мы также не определяем набор символов и объединение в уровне таблицы. В этой ситуации MySQL проверяет уровень базы данных, чтобы определить параметры настройки таблицы, которые с этого времени станут параметрами настройки столбца. Следовательно, набор символов для столбца c1 latin2 и объединение latin2_czech_ci.
10.3.8.
Совместимость с другими СУБДДля совместимости с MaxDB эти две инструкции те же самые:
CREATE TABLE t1 (f1 CHAR(N) UNICODE);
CREATE TABLE t1 (f1 CHAR(N)
CHARACTER SET ucs2);
10.4. Наборы символов и объединения подключения
Несколько переменных системы для наборов символов и объединений касаются взаимодействия пользователя с сервером. Некоторые из них были упомянуты в более ранних разделах:
Набор символов и объединение сервера могут быть определены из значений переменных системы character_set_server и collation_server.
Набор символов и объединение заданной по умолчанию базы данных могут быть определены из значений переменных системы character_set_database и collation_database.
Дополнительный набор символов и объединения переменные системы включаются в трафике обработки для подключения. Каждый пользователь имеет связанные с подключением переменные системы набора символов и объединения.
Когда Вы соединяетесь с сервером, клиент посылает инструкции SQL. Сервер посылает ответы, типа наборов результатов, обратно пользователю. Это ведет к нескольким вопросам относительно набора символов и обработки объединения для подключений пользователя, каждому из которых можно отвечать в терминах переменных системы:
В каком наборе символов является инструкция от пользователя?
Сервер берет переменную системы character_set_client, чтобы разобраться с набором символов, в котором инструкции посланы пользователем.
В какой набор символов сервер должен транслировать инструкцию после получения?
Для этого сервер использует переменные системы character_set_connection и collation_connection. Это преобразовывает инструкции, посланные пользователем, из character_set_client в character_set_connection (но не строковые литералы, которые имеют introducer типа _latin1 или _utf8). collation_connection важен для сравнений литеральных строк. Для сравнений строк со значениями столбца collation_connection не имеет значения, потому что столбцы имеют их собственное объединение, которое имеет более высокое старшинство.
К какому набор символов сервер должен транслировать данные перед пересылкой наборов результатов или сообщений об ошибках обратно пользователю?
Переменная системы character_set_results указывает набор символов, в котором сервер возвращает результаты запроса пользователю. Это включает данные результата типа значений столбца, и метаданных результата типа имени столбца.
Вы можете подстраивать параметры настройки для этих переменных или зависеть от значений по умолчанию (тогда Вы можете пропустить остальную часть этого раздела).