Spec-Zone.ru › MariaDB

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

Некоторые идентификаторы сопоставляются с именем файла в файловой системе. Базы данных имеют свой собственный каталог, а имена таблиц и индексов могут сопоставляться с именем файла, в зависимости от движка хранения.

Не все символы, разрешенные в именах таблиц, могут использоваться в именах файлов. Каждая файловая система имеет свои правила относительно допустимых символов в именах файлов. Чтобы пользователи могли создавать таблицы, используя все символы, разрешенные в SQL-стандарте, и не зависеть от конкретной файловой системы, в которой находится база данных, MariaDB кодирует "потенциально небезопасные" символы в имени таблицы для получения соответствующего имени файла.

Это реализуется с использованием специального набора символов. MariaDB преобразует имя таблицы в набор символов "filename", чтобы получить имя файла для этой таблицы. И она преобразует имя файла из набора символов "filename" в, например, utf8, чтобы получить имя таблицы для этого имени файла.

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

Диапазон кодов Шаблон Число Используемые Неиспользуемые Блоки
00C0..017F [@][0..4][g..z] 5*20= 100 97 3 Дополнительные символы латинского алфавита-1 + Расширенный латинский алфавит-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 Расширенный латинский алфавит-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 Формы половинной и полной ширины

Значения диапазона кодов — UCS-2.

Всё это кодирование происходит прозрачно на уровне файловой системы за одним исключением. До MySQL 5.1.6 использовалась старая кодировка. Идентификаторы, созданные в версии до MySQL 5.1.6 и не обновлённые до новой кодировки, сервер добавляет mysql50 в их имя.

Примеры

Найти имя файла для таблицы с именем, не относящимся к латинскому алфавиту-1:

select cast(convert("this_is_таблица" USING filename) as binary);
+------------------------------------------------------------------+
| cast(convert("this_is_таблица" USING filename) as binary)        |
+------------------------------------------------------------------+
| this_is_@y0@g0@h0@r0@o0@i1@g0                                    |
+------------------------------------------------------------------+

Найти имя таблицы для имени файла:

select convert(_filename "this_is_@y0@g0@h0@r0@o0@i1@g0" USING utf8);
+---------------------------------------------------------------+
| convert(_filename "this_is_@y0@g0@h0@r0@o0@i1@g0" USING utf8) |
+---------------------------------------------------------------+
| this_is_таблица                                               |
+---------------------------------------------------------------+

Старая таблица, созданная до MySQL 5.1.6, со старой кодировкой:

SHOW TABLES;
+--------------------+
| Tables_in_test     |
+--------------------+
| #mysql50#table@1   |
+--------------------+

Для ссылки на эту таблицу необходимо предоставить префикс:

SHOW COLUMNS FROM `table@1`;
ERROR 1146 (42S02): Table 'test.table@1' doesn't exist

SHOW COLUMNS FROM `#mysql50#table@1`;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают мнения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/identifier-to-file-name-mapping/

Spec-Zone.ru

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