Spec-Zone .ru
спецификации, руководства, описания, API
|
Метаданные являются "данными о данных." Что-либо, что описывает
базу данных — в противоположность тому, чтобы быть содержанием базы
данных — является метаданными. Таким образом имена столбцов, имена базы данных, имена пользователей, имена
версии, и большая часть строки следуют SHOW
метаданные. Это также верно для содержания таблиц в INFORMATION_SCHEMA
потому что
те таблицы по определению содержат информацию об объектах базы данных.
Представление метаданных должно удовлетворить эти требования:
Все метаданные должны быть в том же самом наборе символов. Иначе, ни один SHOW
операторы, ни SELECT
операторы для таблиц в 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, "Сопоставление Выражений".