Spec-Zone.ru › MySQL 5.7

9.2.4 Сопоставление идентификаторов с именами файлов

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

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

В идентификаторах баз данных и таблиц допустим любой символ, кроме ASCII NUL (X'00'). MySQL кодирует любые символы, проблематичные в соответствующих объектах файловой системы, при создании каталогов баз данных или файлов таблиц:

  • Основные латинские буквы (a..zA..Z), цифры (0..9) и символ подчеркивания (_) кодируются как есть. Соответственно, их регистрозависимость напрямую зависит от особенностей файловой системы.

  • Все другие национальные буквы из алфавитов, имеющих отображение верхнего/нижнего регистра, кодируются, как показано в следующей таблице. Значения в столбце «Диапазон кодов» — значения UCS-2.

    Диапазон кодов Шаблон Количество Используемые Неиспользуемые Блоки
    00C0..017F [@][0..4][g..z] 5*20= 100 97 3 Latin-1 Supplement + Latin Extended-A
    0370..03FF [@][5..9][g..z] 5*20= 100 88 12 Греческий и коптский
    0400..052F [@][g..z][0..6] 20*7= 140 137 3 Кириллица + Дополнительная кириллица
    0530..058F [@][g..z][7..8] 20*2= 40 38 2 Армянский
    2160..217F [@][g..z][9] 20*1= 20 16 4 Числовые формы
    0180..02AF [@][g..z][a..k] 20*11=220 203 17 Latin Extended-B + Расширения IPA
    1E00..1EFF [@][g..z][l..r] 20*7= 140 136 4 Дополнительные расширения латинского алфавита
    1F00..1FFF [@][g..z][s..z] 20*8= 160 144 16 Расширенный греческий
    .... .... [@][a..f][g..z] 6*20= 120 0 120 ЗАРЕЗЕРВИРОВАНО
    24B6..24E9 [@][@][a..z] 26 26 0 Закрытые алфавитно-цифровые символы
    FF21..FF5A [@][a..z][@] 26 26 0 Формы половинной и полной ширины

    Один из байтов в последовательности кодирует регистр буквы. Например: LATIN CAPITAL LETTER A WITH GRAVE кодируется как @0G, в то время как LATIN SMALL LETTER A WITH GRAVE кодируется как @0g. Здесь третий байт (G или g) указывает регистр. (В файловой системе, нечувствительной к регистру, обе буквы обрабатываются как одинаковые.)

    Для некоторых блоков, таких как кириллица, второй байт определяет регистр. Для других блоков, таких как Latin1 Supplement, третий байт определяет регистр. Если два байта в последовательности являются буквами (как в расширенном греческом), левая буква в паре определяет регистр. Все остальные буквы должны быть в нижнем регистре.

  • Все символы, не являющиеся буквами, за исключением символа подчеркивания (_), а также буквы из алфавитов, не имеющих отображения верхнего/нижнего регистра (например, иврит), кодируются с помощью шестнадцатеричного представления, используя строчные буквы для шестнадцатеричных цифр a..f:

    0x003F -> @003f
    0xFFFF -> @ffff
    

    Шестнадцатеричные значения соответствуют значениям символов в ucs2 кодировке двойного байта.

В 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 exist

mysql> SHOW COLUMNS FROM `#mysql50#a@b`;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

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

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

Чтобы проверить только определенные базы данных или таблицы, опустите --all-databases и укажите соответствующие аргументы базы данных или таблицы. Справочную информацию по синтаксису вызова mysqlcheck см. в разделе 4.5.3, «mysqlcheck — Утилита обслуживания таблиц».

Примечание

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

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

Примечание

Преобразование имен баз данных, предшествующих MySQL 5.1, содержащих специальные символы, в формат 5.1 с добавлением префикса #mysql50# устарело; ожидается его удаление в будущей версии MySQL. Поскольку такие преобразования устарели, параметры --fix-db-names и --fix-table-names для mysqlcheck и предложение UPGRADE DATA DIRECTORY NAME для инструкции ALTER DATABASE также устарели.

Обновления поддерживаются только между версиями одной серии (например, 5.0 до 5.1 или 5.1 до 5.5), поэтому необходимость преобразования имен баз данных 5.0 в текущие версии MySQL должна быть минимальной. В качестве обходного решения обновите установку MySQL 5.0 до MySQL 5.1 перед обновлением до более новой версии.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/identifier-mapping.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API