Механизм хранения таблиц для <TABLE> не имеет этой опции.
Это ошибка, возвращаемая MySQL по order by
запросу. Тип столбца - varchar(2000)
.
Запрос:
select * from `dbo.table_1` order by textT;
Возвращена ошибка:
ОШИБКА 1031 (HY000): механизм хранения таблиц для 'dbo.table_1' не имеет этой опции.
Почему так происходит? И как это исправить?
dbo
и для имени таблицыtable_1
select * from `dbo`.`table_1` order by textT
max_length_for_sort_data
SHOW CREATE TABLE table_1
.Ответы:
Эта проблема возникает, когда вы импортируете определение таблицы, которое было создано с помощью MyISAM, но позже было переключено на InnoDB; полученные
ROW_FORMAT
параметры кажутся недопустимыми.Если вы пытаетесь импортировать экспортированную базу данных и сталкиваетесь с этой проблемой, вы можете просто выполнить поиск и
ROW_FORMAT=FIXED
ничего не заменить .Чтобы сделать это очень быстро, я использовал следующее:
Задача решена! Спасибо jbrahy за указание на то, что проблема была в ROW_FORMAT.
РЕДАКТИРОВАТЬ: обновлено для работы на других платформах в соответствии с предложением @ seven
источник
sed -ie 's/ROW_FORMAT=FIXED//g' backup.sql
FIXED
более ранних версиях он автоматически меняется наCOMPACT
. Похоже, это предполагает, чтоsed -ie 's/ROW_FORMAT=FIXED/ROW_FORMAT=COMPACT/g' backup.sql
это было бы «более безопасным» решением с точки зрения сохранения того же поведения.Я получаю ту же ошибку, когда импортирую определение таблицы InnoDB с ROW_FORMAT = DYNAMIC в нем. Таблица была создана с помощью движка MyISAM, но позже я переключил ее на InnoDB. Когда я удалил ROW_FORMAT = DYNAMIC из оператора create table и воссоздал таблицу, все заработало. Моим решением вашей проблемы было бы следующее.
show create table `dbo.table_1`;
затем возьмите вывод этой команды и удалите ROW_FORMAT = DYNAMIC, затем переименуйте таблицу в
dbo.table_1_old
rename table `dbo.table_1` to `dbo.table_1_old`;
Затем выполните оператор создания таблицы с первого шага, т.е.
-- don't use this create as there are missing columns use yours create table `dbo.table_1` (textT VARCHAR(255));
Затем заново заполните таблицу старыми данными.
insert into `dbo.table_1` select * from `dbo.table_1_old`;
Тогда вы сможете выполнить свой исходный SQL
select * from `dbo.table_1` order by textT;
источник
Вы также можете попробовать это:
ALTER TABLE `dbo.table_1` ROW_FORMAT = DEFAULT ;
источник
Эта проблема возникает, когда вы импортируете определение таблицы в MySQL 5.7, которая была создана с MySQL 5.6 и ранее. Та же ошибка может быть вызвана параметром KEY_BUFFER_SIZE = 8192 и аналогичными размерами, определенными в байтах для INNODB ENGINE. У меня была эта ошибка при импорте базы из sql-dump. Решение: sed -ie 's / KEY_BLOCK_SIZE = 16384 // g' my-file-sql_dump.sql
источник
Я столкнулся с этой проблемой, и мой файл резервной копии был зашифрованным
.zsql
. Поэтому я изменил my.cnf, добавивinnodb_strict_mode = off
. Все работало нормальноисточник