- Има ограничения за размера на ИНДЕКС. Сблъскахте се с ограничението, защото utf8mb4 се нуждае от до 4 байта на знак , където като utf8 са необходими само 3. Междувременно ограничението за размера на ИНДЕКС е в байтове .
„Решението“ е да решите какво да правите с индекса с големи размери. (повече по-долу)
2.
ALTER TABLE t CHANGE col col ...
е същото като по-логичното
ALTER TABLE t MODIFY col ...
Първият ви позволява да промените името на колоната, следователно две копия на името на колоната, когато не е необходимо да променяте името.
-
Много вероятно сте имали
VARCHAR(255)
който отнема 767 байта в utf8 (3*255+2; "2" е размерът на полето за дължина). Еквивалентът в 4-байтовия utf8mb4 би бил (191) (4*191+2=766; няма място за повече от 191). -
Не видях статия за това. Подозирам, че това, което току-що казах, е повечето от това, което трябва да се каже.
Така че...
ПланА :Имате ли foo VARCHAR(255)
и беше utf8? Данните в него винаги ли (сега и в бъдеще) са по-къси от 191 знака? Ако е така, просто направете ALTER.
ПланБ :Ако имате нужда от повече от 191, наистина ли имате нужда от ИНДЕКС? DROP INDEX може да е алтернатива.
ПланC :Или можете да използвате индекс с "префикс":INDEX(foo(191))
, оставяйки го VARCHAR(255)
. Обикновено "префиксните" индекси са безполезни, но вие можете има случай на употреба, за който работи.
За да обсъдите това допълнително, моля, предоставете SHOW CREATE TABLE
за въпросната таблица и обсъдете значението на това конкретно поле и неговия ИНДЕКС.