- Det finns begränsningar för storleken på ett INDEX. Du stötte på gränsen eftersom utf8mb4 behöver upp till 4 byte per tecken , där utf8 bara behöver 3. Under tiden är INDEX-storleksgränsen i byte .
"Lösningen" är att bestämma vad man ska göra med det överdimensionerade indexet. (mer nedan)
2.
ALTER TABLE t CHANGE col col ...
är samma som den mer logiska
ALTER TABLE t MODIFY col ...
Den förra låter dig ändra namnet på kolumnen, därav två kopior av kolumnnamnet när du inte behöver ändra namnet.
-
Helt troligt hade du
VARCHAR(255)
som tar 767 byte i utf8 (3*255+2; "2" är storleken på längdfältet). Motsvarigheten i 4-byte utf8mb4 skulle vara (191) (4*191+2=766; inte plats för mer än 191). -
Jag har inte sett en artikel om det. Jag misstänker att det jag just sa är det mesta som behöver sägas.
Så...
Plan A :Har du foo VARCHAR(255)
och det var utf8? Är data i den alltid (nu och i framtiden) kortare än 191 tecken? Om så är fallet gör du helt enkelt ALTER.
Plan B :Om du behöver mer än 191, behöver du verkligen INDEX? DROP INDEX kan vara ett alternativ.
Plan C :Eller så kan du använda ett "prefix"-index:INDEX(foo(191))
, medan du lämnar den VARCHAR(255)
. Vanligtvis är "prefix"-index värdelösa, men du kanske har ett användningsfall som det fungerar för.
För att diskutera detta vidare, vänligen tillhandahåll SHOW CREATE TABLE
för tabellen i fråga och diskutera innebörden av det specifika fältet och dess INDEX.