- Der er grænser for størrelsen af et INDEX. Du stødte ind i grænsen, fordi utf8mb4 har brug for op til 4 bytes pr. tegn , hvor som utf8 kun behøver 3. I mellemtiden er INDEX-størrelsesgrænsen i bytes .
'Løsningen' er at beslutte, hvad der skal gøres ved det overdimensionerede indeks. (mere nedenfor)
2.
ALTER TABLE t CHANGE col col ...
er det samme som det mere logiske
ALTER TABLE t MODIFY col ...
Førstnævnte giver dig mulighed for at ændre navnet på kolonnen, deraf to kopier af kolonnenavnet, når du ikke behøver at ændre navnet.
-
Det er sandsynligt, at du havde
VARCHAR(255)
som tager 767 bytes i utf8 (3*255+2; "2" er størrelsen af længdefeltet). Det tilsvarende i 4-byte utf8mb4 ville være (191) (4*191+2=766; ikke plads til mere end 191). -
Jeg har ikke set en artikel om det. Jeg formoder, at det, jeg lige har sagt, er det meste af det, der skal siges.
Så...
Plan A :Har du foo VARCHAR(255)
og det var utf8? Er dataene i den altid (nu og i fremtiden) kortere end 191 tegn? Hvis det er tilfældet, skal du blot gøre ALTER.
Plan B :Hvis du har brug for mere end 191, har du så virkelig brug for INDEX? DROP INDEX kan være et alternativ.
Plan C :Eller du kan bruge et "præfiks"-indeks:INDEX(foo(191))
, mens du forlader den VARCHAR(255)
. Normalt er "præfiks"-indekser ubrugelige, men du måske har en use case, som den virker til.
For at diskutere dette yderligere, angiv venligst SHOW CREATE TABLE
for den pågældende tabel, og diskuter betydningen af det pågældende felt og dets INDEKS.