- Velikost INDEXU má omezení. Narazili jste na limit, protože utf8mb4 potřebuje až 4 bajty za znak , kde jako utf8 potřebuje pouze 3. Mezitím je limit velikosti INDEXu v bajtech .
„Řešením“ je rozhodnout se, co dělat s příliš velkým indexem. (více níže)
2.
ALTER TABLE t CHANGE col col ...
je stejný jako logičtější
ALTER TABLE t MODIFY col ...
První možnost vám umožňuje změnit název sloupce, tedy dvě kopie názvu sloupce, když nepotřebujete měnit název.
-
Dost pravděpodobně jste měli
VARCHAR(255)
který zabírá 767 bajtů v utf8 (3*255+2; "2" je velikost pole délky). Ekvivalent ve 4bajtovém utf8mb4 by byl (191) (4*191+2=766; není místo pro více než 191). -
Neviděl jsem o tom článek. Mám podezření, že to, co jsem právě řekl, je většina z toho, co je třeba říci.
Takže...
Plán A :Máte foo VARCHAR(255)
a bylo to utf8? Jsou údaje v něm vždy (nyní i v budoucnu) kratší než 191 znaků? Pokud ano, pak jednoduše proveďte ALTER.
Plán B :Pokud potřebujete více než 191, opravdu potřebujete INDEX? Alternativou může být DROP INDEX.
Plán C :Nebo můžete použít "prefix" index:INDEX(foo(191))
, zatímco ponecháte VARCHAR(255)
. Obvykle jsou "prefixové" indexy k ničemu, ale můžete mít případ použití, pro který to funguje.
Chcete-li o tom dále diskutovat, poskytněte SHOW CREATE TABLE
pro danou tabulku a diskutujte o významu tohoto konkrétního pole a jeho INDEXU.