Сопоставление идентификаторов с именами файлов
Некоторые идентификаторы сопоставляются с именем файла в файловой системе. Базы данных имеют свой собственный каталог, а имена таблиц и индексов могут сопоставляться с именем файла, в зависимости от движка хранения.
Не все символы, разрешенные в именах таблиц, могут использоваться в именах файлов. Каждая файловая система имеет свои правила относительно допустимых символов в именах файлов. Чтобы пользователи могли создавать таблицы, используя все символы, разрешенные в 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 | | +-------+---------+------+-----+---------+-------+
© 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/