Метаданные – это данные о данных. Все, что описывает базу данных, в отличие от самого содержимого базы данных, является метаданными. То есть имена столбцов, имена баз данных, имена пользователей, имена версий и большинство строковых результатов операторов SHOW являются метаданными.
Представление метаданных должно удовлетворять следующим требованиям:
- Все метаданные должны быть представлены в одном символьном наборе. В противном случае SHOW не будет правильно работать, поскольку разные строки в одном и том же столбце будут иметь разные символьные наборы.
- Метаданные должны включать все символы всех языков. Иначе пользователи не смогут называть столбцы и таблицы на их собственных языках.
С тем чтобы удовлетворить обоим требованиям, MySQL сохраняет метаданные в символьном наборе Unicode, называемом UTF8. Это не приводит ни к каким последствиям, если вы не используете диакритических знаков. Но если упомянутые знаки применяются, вам стоит помнить, что метаданные хранятся в наборе UTF8.
Это значит, что функции USERO, CURRENTJJSER() и VERSION() будут по умолчанию возвращать значения в наборе символов UTF8. То же относится и ко всем их синонимам, таким как синонимы функции USER () -SESSION_USER() и SYSTEM_USER ().
Сервер устанавливает значение системной переменной character_set_system равным имени символьного набора метаданных:
mysql SHOW VARIABLES LIKE ‘characteriset_system1;
Variable name I Value
Сохранение метаданных в Unicode не означает, что заголовки столбцов и результаты функций DESCRIBE будут по умолчанию в символьном наборе character_set_system. Когда вы выдаете SELECT columnl from t, имя columnl само по себе будет возвращено с сервера клиенту в том символьном наборе, который определен оператором SET NAMES. Более точно используемый набор символов определяется значением системной переменной character_set_results. Если эта переменная установлена в NULL, никакого преобразования не происходит и сервер возвращает метаданные, используя оригинальный набор символов (заданный в character_set_system).
Если вы не хотите, чтобы сервер присылал метаданные обратно в символьном наборе, отличном от UTF8, применяйте SET NAMES для принудительного преобразования на сервере (см. раздел Наборы символов и порядки сопоставления на уровне соединения), либо выполняйте преобразование на клиенте. Всегда более эффективно переносить преобразование на сторону клиента, однако этот выбор не доступен для многих клиентов вплоть до серии продуктов MySQL 4.x.
Если вы используете, например, только функцию USER () для сравнения или присваивания внутри отдельного оператора, то беспокоиться не следует. MySQL выполнит некоторое автоматическое преобразование сам.
SELECT * FROM Tablel WHERE USER() = latinl_column;
Это работает потому, что значение latinl_column перед сравнением автоматически преобразуется в UTF8.
INSERT INTO Tablel (latinl_column) SELECT USER();
Это работает по той причине, что значение USER () перед присваиванием автоматически преобразуется в latinl. Автоматическое преобразование пока не полностью реализовано, но будет работать правильно в более поздних версиях.
Несмотря на то что автоматическое преобразование не включено в стандарт SQL, документация по стандарту SQL утверждает, что каждый символьный набор является (в смысле поддерживаемых символов)подмножеством Unicode. Принимая во внимание известный принцип, который состоит в том, чтовсе, определенное для супермножества, касается и подмножества, мы уверены, что порядок сопоставления для Unicode может применяться для сравнений строк в кодировке, отличной от Unicode.