sql >> Database >  >> RDS >> Mysql

Problemen en vragen bij het migreren van MySQL UTF8 naar UTF8MB4

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

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

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



  1. Hoe tekst af te kappen met een ellips in MariaDB

  2. lower_case_table_names=1 op Ubuntu 18.04 laat mysql niet starten

  3. Waarom retourneert het selecteren van SCOPE_IDENTITY() een decimaal in plaats van een geheel getal?

  4. stuur gegevens naar MySQL met AJAX + jQuery + PHP