12.2.2 UTF-8 для метаданных
Метаданные — это “данные о данных”. Всё, что описывает базу данных, — в отличие от содержимого базы данных — является метаданными. Таким образом, имена столбцов, имена баз данных, имена пользователей, имена версий и большинство строковых результатов из 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 | utf8mb3 |
+----------------------+---------+
Хранение метаданных с использованием Unicode не означает, что сервер по умолчанию возвращает заголовки столбцов и результаты функций DESCRIBE в наборе символов character_set_system. При использовании SELECT column1 FROM
t имя column1 само возвращается с сервера на клиент в наборе символов, определяемом значением системной переменной character_set_results, которая имеет значение по умолчанию utf8mb4. Если вы хотите, чтобы сервер передавал результаты метаданных в другом наборе символов, используйте оператор SET NAMES для принудительного выполнения преобразования набора символов. SET NAMES устанавливает системные переменные character_set_results и другие связанные переменные. (См. Раздел 12.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, стандарт гласит, что каждый набор символов (с точки зрения поддерживаемых символов) является “подмножеством” Unicode. Поскольку это общеизвестный принцип, что “то, что применяется к супермножеству, может применяться и к подмножеству”, мы полагаем, что сортировка для Unicode может применяться для сравнений с не-Unicode строками. Дополнительную информацию о принудительном преобразовании строк см. в Разделе 12.8.4, «Принудительное преобразование сортировки в выражениях».
© 2025 Oracle
Licensed under the GPLv2 License.