Wiem, że na pytania o tym tytule odpowiadano już wcześniej, ale proszę czytaj dalej. Przeczytałem dokładnie wszystkie inne pytania / odpowiedzi dotyczące tego błędu przed wysłaniem.
Otrzymuję powyższy błąd dla następującego zapytania:
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` (
`menu_id` varchar(32) NOT NULL,
`parent_menu_id` int(32) unsigned DEFAULT NULL,
`menu_name` varchar(255) DEFAULT NULL,
`menu_link` varchar(255) DEFAULT NULL,
`plugin` varchar(255) DEFAULT NULL,
`menu_type` int(1) DEFAULT NULL,
`extend` varchar(255) DEFAULT NULL,
`new_window` int(1) DEFAULT NULL,
`rank` int(100) DEFAULT NULL,
`hide` int(1) DEFAULT NULL,
`template_id` int(32) unsigned DEFAULT NULL,
`alias` varchar(255) DEFAULT NULL,
`layout` varchar(255) DEFAULT NULL,
PRIMARY KEY (`menu_id`),
KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Czy ktoś ma pomysł, dlaczego i jak to naprawić? Problem polega na tym, że to samo zapytanie działa doskonale na moim komputerze lokalnym i działało również na moim poprzednim hoście. Przy okazji, pochodzi z dojrzałego projektu - phpdevshell - więc myślę, że ci faceci wiedzą, co robią, chociaż nigdy nie wiadomo.
Każda wskazówka jest mile widziana.
Używam phpMyAdmin.
źródło
Ten błąd oznacza, że długość indeksu przekracza
index
1000 bajtów. To ograniczenie może mieć MySQL i silniki pamięci masowej. Mam podobny błąd w MySQL 5.5 - „Określony klucz był za długi; maksymalna długość klucza to 3072 bajtów po uruchomieniu tego skryptu:UTF8 jest wielobajtowy, a długość klucza jest obliczana w ten sposób - 500 * 3 * 6 = 9000 bajtów.
Ale uwaga, następne zapytanie działa!
... ponieważ użyłem CHARSET = latin1, w tym przypadku długość klucza to 500 * 6 = 3000 bajtów.
źródło
Miałem ten problem i rozwiązałem go, wykonując następujące czynności:
Odniesienie
źródło
uruchom to zapytanie przed utworzeniem lub zmianą tabeli.
SET @@global.innodb_large_prefix = 1;
spowoduje to ustawienie maksymalnej długości klucza na 3072 bajty
źródło
Ten limit rozmiaru indeksu wydaje się być większy w przypadku 64-bitowych kompilacji MySQL.
Uderzałem w to ograniczenie, próbując zrzucić naszą deweloperską bazę danych i załadować ją na lokalny virt VMWare. W końcu zdałem sobie sprawę, że zdalny serwer deweloperski był 64-bitowy i utworzyłem 32-bitowy virt. Właśnie utworzyłem 64-bitowy virt i mogłem lokalnie załadować bazę danych.
źródło
Właśnie ominąłem ten błąd, po prostu zmieniając wartości „długości” w oryginalnej bazie danych na łącznie około „1000”, zmieniając jej strukturę, a następnie eksportując to samo na serwer. :)
źródło
Miałem ten sam problem, użyłem poniższego zapytania, aby go rozwiązać.
Podczas tworzenia bazy danych możesz używać kodowania utf-8
na przykład.
create database my_db character set utf8 collate utf8mb4;
EDYCJA: (Biorąc pod uwagę sugestie z komentarzy) Zmieniono utf8_bin na utf8mb4
źródło
utf8
NIE jestutf8
, jest to błędny, zastrzeżony format, który nigdy nie powinien był zaowocować.utf8mb4
jest prawdąutf8
i jest zalecaną wartością domyślną dla prawidłowegoutf8
wsparcia.utf8mb4
jest poprawnym kodowaniem do użycia w mysql, a nieutf8