sql >> Database teknologi >  >> RDS >> Mysql

Migrering af MySQL UTF8 til UTF8MB4 problemer og spørgsmål

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

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

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



  1. Kan ikke løse sorteringskonflikten mellem SQL_Latin1_General_CP1_CI_AS og Latin1_General_CI_AS i lig med operationen

  2. Kaldning af en lagret procedure inden for en lagret procedure

  3. Tildeling af rettigheder til lagret procedure til en anden bruger af Oracle

  4. Sådan bruger du 'select' i MySQL 'insert'-sætning