- Er zijn limieten voor de grootte van een INDEX. Je bent tegen de limiet aangelopen omdat utf8mb4 tot 4 bytes nodig heeft per karakter , waar utf8 er maar 3 nodig heeft. Ondertussen is de INDEX-limiet in bytes .
De 'oplossing' is om te beslissen wat te doen met de te grote index. (meer hieronder)
2.
ALTER TABLE t CHANGE col col ...
is hetzelfde als de meer logische
ALTER TABLE t MODIFY col ...
Met de eerste kunt u de naam van de kolom wijzigen, dus twee exemplaren van de kolomnaam wanneer u de naam niet hoeft te wijzigen.
-
Zeer waarschijnlijk had u
VARCHAR(255)
wat 767 bytes in utf8 kost (3*255+2; de "2" is de grootte van het lengteveld). Het equivalent in de 4-byte utf8mb4 zou zijn (191) (4*191+2=766; niet meer dan 191). -
Ik heb er geen artikel over gezien. Ik vermoed dat wat ik net zei het meeste is van wat gezegd moet worden.
Dus...
Plan A :Heeft u foo VARCHAR(255)
en het was utf8? Zijn de gegevens erin altijd (nu en in de toekomst) korter dan 191 karakters? Als dat zo is, doe dan gewoon de ALTER.
Plan B :Als u meer dan 191 nodig heeft, heeft u de INDEX dan echt nodig? DROP INDEX kan een alternatief zijn.
Plan C :Of u kunt een "prefix"-index gebruiken:INDEX(foo(191))
, terwijl je het VARCHAR(255)
. laat . Gewoonlijk zijn "prefix"-indexen nutteloos, maar u misschien hebben een use case waarvoor het werkt.
Om dit verder te bespreken, geef a.u.b. SHOW CREATE TABLE
voor de betreffende tabel, en bespreek de betekenis van dat specifieke veld en zijn INDEX.