Mechanizm przechowywania tabel dla <TABLE> nie ma tej opcji.
To jest błąd zwracany przez MySQL w order by
zapytaniu. Typ kolumny to varchar(2000)
.
Pytanie:
select * from `dbo.table_1` order by textT;
Zwrócony błąd:
BŁĄD 1031 (HY000): Silnik przechowywania tabel dla „dbo.table_1” nie ma tej opcji.
Dlaczego to się dzieje? Jak mogę to naprawić?
dbo
i nazwy tabelitable_1
select * from `dbo`.`table_1` order by textT
max_length_for_sort_data
SHOW CREATE TABLE table_1
.Odpowiedzi:
Wydaje się, że ten problem występuje podczas importowania definicji tabeli, która została utworzona za pomocą MyISAM, ale później została przełączona do InnoDB; wynikowy
ROW_FORMAT
opcje wydają się być nieprawidłowe.Jeśli próbujesz zaimportować wyeksportowaną bazę danych i napotkasz ten problem, możesz po prostu wyszukać i zamienić
ROW_FORMAT=FIXED
nic.Użyłem następujących, aby zrobić to naprawdę szybko:
Problem rozwiązany! Dziękuję jbrahy za wskazanie, że to ROW_FORMAT był problemem.
EDYCJA: Zaktualizowano, aby działał na większej liczbie platform zgodnie z sugestią @ seven
źródło
sed -ie 's/ROW_FORMAT=FIXED//g' backup.sql
FIXED
został po cichu zmieniony naCOMPACT
MySQL 5.6 i wcześniejsze. Wydaje się to sugerować, żesed -ie 's/ROW_FORMAT=FIXED/ROW_FORMAT=COMPACT/g' backup.sql
byłoby to „bezpieczniejsze” rozwiązanie pod względem utrzymania tego samego zachowania.Otrzymuję ten sam błąd, gdy importuję definicję tabeli, która jest InnoDB z ROW_FORMAT = DYNAMIC w nim. Tabela została utworzona za pomocą silnika MyISAM, ale później przeniosłem ją na InnoDB. Kiedy usunąłem ROW_FORMAT = DYNAMIC z instrukcji tworzenia tabeli i ponownie utworzyłem tabelę, działało dobrze. Moim rozwiązaniem twojego problemu byłoby to.
show create table `dbo.table_1`;
następnie weź dane wyjściowe z tego polecenia i usuń ROW_FORMAT = DYNAMIC, a następnie zmień nazwę tabeli na
dbo.table_1_old
rename table `dbo.table_1` to `dbo.table_1_old`;
Następnie wykonaj instrukcję create table z pierwszego kroku, tj
-- don't use this create as there are missing columns use yours create table `dbo.table_1` (textT VARCHAR(255));
Następnie ponownie wypełnij tabelę starymi danymi.
insert into `dbo.table_1` select * from `dbo.table_1_old`;
Wtedy powinieneś być w stanie wykonać oryginalny SQL
select * from `dbo.table_1` order by textT;
źródło
Możesz także spróbować tego:
ALTER TABLE `dbo.table_1` ROW_FORMAT = DEFAULT ;
źródło
Wydaje się, że ten problem występuje podczas importowania definicji tabeli do MySQL 5.7, która została utworzona za pomocą MySQL 5.6 i wcześniejszych. Ten sam błąd może być spowodowany opcją KEY_BUFFER_SIZE = 8192 i podobnymi rozmiarami zdefiniowanymi w bajtach dla INNODB ENGINE. Wystąpił ten błąd podczas importowania bazy z sql-dump. Decyzja: sed -ie 's / KEY_BLOCK_SIZE = 16384 // g' my-file-sql_dump.sql
źródło
Miałem do czynienia z tym problemem, a mój plik kopii zapasowej był
.zsql
plikiem zaszyfrowanym . Więc zmodyfikowałem my.cnf, dodającinnodb_strict_mode = off
. Działało dobrzeźródło