Поиск

UTF8 для метаданных

Метаданные - это данные о данных. Все, что описывает базу данных, в отличие от самого содержимого базы данных, является метаданными. То есть имена столбцов, име­на баз данных, имена пользователей, имена версий и большинство строковых результа­тов операторов SHOW являются метаданными.
Представление метаданных должно удовлетворять следующим требованиям:

  1. Все метаданные должны быть представлены в одном символьном наборе. В противном случае SHOW не будет правильно работать, поскольку разные строки в одном и том же столбце будут иметь разные символьные наборы.
  2. Метаданные должны включать все символы всех языков. Иначе пользователи не смогут называть столбцы и таблицы на их собственных языках.

С тем чтобы удовлетворить обоим требованиям, 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

\ character_set_system \ utf8 |
Сохранение метаданных в 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.