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

9.2.3. Отображение Идентификаторов к Именам файлов

Есть корреспонденция между базой данных и табличными идентификаторами и именами в файловой системе. Для базовой структуры MySQL представляет каждую базу данных как каталог в каталоге данных, и каждую таблицу одним или более файлами в соответствующем каталоге базы данных. Для файлов формата таблицы (.FRM), данные всегда хранятся в этой структуре и расположении.

Для файлов данных и индексных файлов, точное представление на диске является определенным механизмом хранения. Эти файлы могут храниться в том же самом расположении как FRM файлы, или информация могут храниться в отдельном файле. InnoDB данные хранятся в файлах данных InnoDB. Если Вы используете табличные области с InnoDB, тогда определенные файлы табличной области, которые Вы создаете, используются вместо этого.

Любой символ является законным в базе данных или табличных идентификаторах кроме ASCII NUL (0x00). MySQL кодирует любые символы, которые проблематичны в соответствующих объектах файловой системы, когда он создает каталоги базы данных или табличные файлы:

На Windows, некоторые имена такой как nul, prn, и aux кодируются, добавляя @@@ к имени, когда сервер создает соответствующий файл или каталог. Это происходит на всех платформах для мобильности соответствующего объекта базы данных между платформами.

Если у Вас есть базы данных или таблицы от версии MySQL, более старого чем 5.1.6, которые содержат специальные символы и для которого базовые имена каталогов или имена файлов не были обновлены, чтобы использовать новое кодирование, сервер выводит на экран их имена с префиксом #mysql50# в выводе от INFORMATION_SCHEMA таблицы или SHOW операторы. Например, если Вам назвали таблицу a@b и его кодирование имени не было обновлено, SHOW TABLES дисплеи это как это:

mysql> SHOW TABLES;+----------------+| Tables_in_test |+----------------+| #mysql50#a@b   |+----------------+

Чтобы обратиться к такому имени, для которого не было обновлено кодирование, следует предоставить #mysql50# префикс:

mysql> SHOW COLUMNS FROM `a@b`;ERROR 1146 (42S02): Table 'test.a@b' doesn't existmysql> SHOW COLUMNS FROM `#mysql50#a@b`;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| i     | int(11) | YES  |     | NULL    |       |+-------+---------+------+-----+---------+-------+

Чтобы обновить старые названия, чтобы избавить от необходимости использовать специальный префикс, чтобы обратиться к ним, повторно закодируйте их с mysqlcheck. Следующая команда обновляет все имена к новому кодированию:

shell> mysqlcheck --check-upgrade --fix-db-names
        --fix-table-names --all-databases

Чтобы проверить только определенные базы данных или таблицы, опустить --all-databases и обеспечьте соответствующую базу данных или табличные параметры. Для получения информации о mysqlcheck синтаксисе вызова см. Раздел 4.5.3, "mysqlcheck — Табличная Программа Обслуживания" .

Отметить

#mysql50# префикс предназначается только, чтобы использоваться внутренне сервером. Недопустимо создать базы данных или таблицы с именами, которые используют этот префикс.

Кроме того, mysqlcheck не может фиксировать имена, которые содержат литеральные экземпляры @ символ, который используется для того, чтобы закодировать специальные символы. Если у Вас есть базы данных или таблицы, которые содержат этот символ, используют mysqldump, чтобы вывести их прежде, чем обновить до MySQL 5.1.6 или позже, и затем перезагрузить файл дампа после обновления.