Я думаю, что это должно повлиять на любые секционированные таблицы. Вы можете подтвердить это?
В Windows по какой-то причине InnoDB преобразует #P
в нижний регистр. Таблица может быть доступна на других платформах, если вы установите lower_case_table_names=2
. Я думаю, что такие настройки не должны существовать в первую очередь.
Чтобы переименовать разделы с правильными именами на InnoDB, может быть возможно сделать следующее:
CREATE TABLE t(a INT)ENGINE=InnoDB;
и скопируйте файл t.frm
в tablename#p#p_cur.frm
RENAME TABLE ``#mysql50#tablename#p#p_cur`` TO ``#mysql50#tablename#P#p_cur``;
(Примечание: вместо одиночных обратных галочек вместо двойных. У меня были проблемы с форматированием в StackOverflow.) - Удалитеfile
tablename#P#p_cur.frm
. - Повторите для каждого раздела.
- Наконец,
DROP TABLE t;
Специальный префикс #mysql50
должен передавать остальную часть имени таблицык механизму хранения, обходя безопасную кодировку имени файла, которая была представлена в MySQL 5.1. Это должно позволить прямой доступ к разделам. Обычно #
кодируется как последовательность @0023
, но механизм разбиения использует необработанный суффикс #P#
.
В MySQL 4.1 и 5.0 имена таблиц кодировались непосредственно в UTF-8. В MySQL 4.0 (который был серией стабильных выпусков, когда я начал работать с внутренними компонентами InnoDB), они могли быть закодированы непосредственно в latin1
, или, возможно, символы не-ASCII в именах таблиц не работали в некоторых файловых системах или операционных системах.
Примечание. Я думаю, что в файле .frm
хранится информация механизма хранения. Если вы просто скопируете файл tablename.frm
многораздельной таблицы, возможно, будет вызван только ha_partition::rename_table()
вместо ha_innobase::rename_table()
. Мы хотим, чтобы операция переименования выполнялась InnoDB, чтобы имя таблицы было переименовано в его собственном словаре данных (таблица SYS_TABLES
, которая читается с помощью INFORMATION_SCHEMA.INNODB_SYS_TABLES
).
Примечание: Iне проверял это. Пожалуйста, сообщите, сработало ли это.