Spec-Zone .ru
спецификации, руководства, описания, API

10.1.12. UTF-8 для Метаданных

Метаданные являются "данными о данных." Что-либо, что описывает базу данных — в противоположность тому, чтобы быть содержанием базы данных — является метаданными. Таким образом имена столбцов, имена базы данных, имена пользователей, имена версии, и большая часть строки следуют SHOW метаданные. Это также верно для содержания таблиц в INFORMATION_SCHEMA потому что те таблицы по определению содержат информацию об объектах базы данных.

Представление метаданных должно удовлетворить эти требования:

Чтобы удовлетворить оба требования, MySQL хранит метаданные в наборе символов Unicode, а именно, UTF-8. Это не вызывает разрушения, если Вы никогда не используете акцентируемые или нелатинские символы. Но если Вы делаете, следует знать, что метаданные находятся в UTF-8.

Требования метаданных означают что возвращаемые значения USER(), CURRENT_USER(), SESSION_USER(), SYSTEM_USER(), DATABASE(), и VERSION() у функций есть набор символов UTF-8 по умолчанию.

Сервер устанавливает character_set_system системная переменная к имени набора символов метаданных:

mysql> SHOW VARIABLES LIKE
        'character_set_system';+----------------------+-------+| Variable_name        | Value |+----------------------+-------+| character_set_system | utf8  |+----------------------+-------+

Хранение метаданных, используя Unicode не означает, что сервер возвращает заголовки столбцов и результаты DESCRIBE функции в character_set_system набор символов по умолчанию. Когда Вы используете SELECT column1 FROM t, имя column1 непосредственно возвращается от сервера до клиента в наборе символов, определенном значением character_set_results системная переменная, у которой есть значение по умолчанию latin1. Если Вы хотите, чтобы сервер пасовал назад результаты метаданных в различном наборе символов, используйте SET NAMES оператор, чтобы вынудить сервер выполнить преобразование набора символов. SET NAMES наборы character_set_results и другие связанные системные переменные. (См. Раздел 10.1.4, "Наборы символов соединения и Сопоставления".) Альтернативно, клиентская программа может выполнить преобразование после получения следствия сервера. Более эффективно для клиента выполнить преобразование, но эта опция не всегда доступна всем клиентам.

Если character_set_results устанавливается в NULL, никакое преобразование не выполняется и метаданные возвратов сервера, используя его исходный набор символов (набор, обозначенный character_set_system).

Сообщения об ошибках, возвращенные от сервера до клиента, преобразовываются в клиентский набор символов автоматически, как с метаданными.

Если Вы используете (например) USER() функция для сравнения или присвоения в пределах единственного оператора, не волноваться. MySQL выполняет некоторое автоматическое преобразование для Вас.

SELECT * FROM t1 WHERE USER() = latin1_column;

Это работает потому что содержание latin1_column автоматически преобразовываются в UTF-8 перед сравнением.

INSERT INTO t1 (latin1_column) SELECT USER();

Это работает потому что содержание USER() автоматически преобразовываются в latin1 перед присвоением.

Хотя автоматическое преобразование не находится в стандарте SQL, документ стандарта SQL действительно говорит, что каждый набор символов является (с точки зрения поддерживаемых символов) "подмножеством" Unicode. Поскольку это - известный принцип, который, "что применяется к надмножеству, может примениться к подмножеству," мы полагаем, что сопоставление для Unicode может просить сравнения со строками не-Unicode. Для получения дополнительной информации о приведении строк, см. Раздел 10.1.7.5, "Сопоставление Выражений".