sql >> Databasteknik >  >> RDS >> Mysql

Migrera MySQL UTF8 till UTF8MB4 problem och frågor

  1. 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.

  1. 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).

  2. 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.



  1. Kan MySQL Cluster hantera en terabyte databas

  2. SQL många till många väljer

  3. Mysql ta bort det specifika ordet i kommaseparerad sträng

  4. Sortera varchar-fält numeriskt i MySQL