- Istnieją ograniczenia dotyczące rozmiaru INDEKSU. Wpadłeś na limit, ponieważ utf8mb4 potrzebuje do 4 bajtów na znak , gdzie jako utf8 potrzebuje tylko 3. Tymczasem limit rozmiaru INDEKSU wynosi bajty .
„Rozwiązaniem” jest podjęcie decyzji, co zrobić z indeksem zawyżonym. (więcej poniżej)
2.
ALTER TABLE t CHANGE col col ...
jest taki sam jak bardziej logiczny
ALTER TABLE t MODIFY col ...
Pierwsza pozwala zmienić nazwę kolumny, stąd dwie kopie nazwy kolumny, gdy nie trzeba zmieniać nazwy.
-
Całkiem prawdopodobne, że masz
VARCHAR(255)
który zajmuje 767 bajtów w utf8 (3*255+2; "2" to rozmiar pola długości). Odpowiednik w 4-bajtowym utf8mb4 to (191) (4*191+2=766; nie ma miejsca na więcej niż 191). -
Nie widziałem artykułu na ten temat. Podejrzewam, że to, co właśnie powiedziałem, jest większością tego, co należy powiedzieć.
Więc...
Plan A :Czy masz foo VARCHAR(255)
a to było utf8? Czy dane w nim zawarte są zawsze (teraz iw przyszłości) krótsze niż 191 znaków? Jeśli tak, po prostu wykonaj ALTER.
Plan B :Jeśli potrzebujesz więcej niż 191, czy naprawdę potrzebujesz INDEKSU? DROP INDEX może być alternatywą.
Plan C :Możesz też użyć indeksu „prefiksu”:INDEX(foo(191))
, pozostawiając go VARCHAR(255)
. Zwykle indeksy „prefiksowe” są bezużyteczne, ale możesz mieć przypadek użycia, dla którego to działa.
Aby omówić to dalej, podaj SHOW CREATE TABLE
dla danej tabeli i omów znaczenie tego konkretnego pola i jego INDEKS.