Pe măsură ce restaurați baza de date dintr-un dump MySQL, vă puteți rezolva problema și, de asemenea, vă protejați baza de date pentru viitor, schimbând setul de caractere și colaționările pentru tabelele, funcțiile și procedurile dvs. Există o serie de modificări între MySQL 5.7 și 8.x, așa că acesta este într-adevăr cel mai bun moment pentru a face acest lucru.
Iată ce poți face cu fiecare CREA
afirmație:
Inlocuieste CHARSET IMPLICIT
la utf8mb4
Inlocuieste COLATEAZĂ
la utf8mb4_unicode_ci
(Pentru tabele) Asigurați-vă că MOTOR
este setat sa InnoDB
Notă: Nu mai doriți să utilizați MyISAM și nici nu doriți să amestecați MOTOR
tipurile cu interogări, deoarece aceasta este o performanță destul de semnificativă.
Faceți toate acestea cu editorul de text preferat, apoi rulați procesul de import într-o bază de date MySQL proaspătă. Asigurați-vă că setați baza de date CHARSET IMPLICIT
și COLATEAZĂ
valorile la aceleași cu cele pe care le aveți pentru tabele, funcții și proceduri.
Motivul sugestiilor:
MySQL 8.0 este o abatere semnificativă de la linia 5.x, cu o mare parte de elemente care au fost depreciate înainte de 5.2 fiind complet eliminate. Aceasta include anumite tipuri de coloane, precum și colaționări. Procesul de import va încerca să adapteze automat elementele depreciate la echivalentele lor moderne, dar adesea face o mizerie de seturi de caractere și colaționări.
The utf8mb4_unicode_ci
s-a dovedit a fi cea mai fiabilă collare atunci când lucrați cu caractere pe mai mulți octeți, cum ar fi emoji și cele utilizate în limbi non-engleze.Deși va folosi puțin mai mult spațiu pe disc, acest lucru se va asigura că aplicațiile dvs. pot gestiona orice caracter aruncat în ea. The _ci
bit la sfârșit asigură că valorile sunt tratate ca insensibile la majuscule și minuscule atunci când se alătură și se efectuează căutări.
Înlocuirea tuturor CHARSET
și COLATEAZĂ
valorile vă vor asigura că nu primiți Combinație ilegală de colaționări
eroare din nou... cu excepția cazului în care...
Lucruri de luat în considerare cu procedurile stocate și declanșatoarele
MySQL 8.0 pare să se aștepte la ceva mai multă specificitate atunci când creează tabele temporare în procedurile stocate. Dacă utilizați tabele temporare, asigurați-vă că le predefiniți în cod, așa cum ați face cu un tabel normal. Sintaxa este aproape aceeași, cu excepția faptului că adăugați un cuvânt suplimentar:
RIDĂȚI TABELUL TEMPORAR DACĂ EXISTĂ `Sume anuale`;
CREAȚI TABEL TEMPORAR DACĂ NU EXISTĂ `YearlySums` (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Acest lucru vă va asigura că nu veți întâlni Combinație ilegală de colaționări
eroare atunci când lucrați cu proceduri stocate.
Dacă mesele dumneavoastră au ÎNAINTE DE INSERE
sau ÎNAINTE DE ACTUALIZARE
declanșatoarele și acele tabele sunt populate prin proceduri stocate, veți dori să faceți o mulțime de teste înainte de a pune baza de date într-o setare de producție. Oracle a introdus o eroare destul de serioasă în 8.0.25, care poate duce la blocarea motorului MySQL Server în anumite cazuri când un INAINTE DE
declanșatorul procesează rândurile ca parte a validării datelor, dar numai atunci când acele date sunt furnizate de o procedură stocată. Problema există de peste un an și Oracle pare să nu-i pese.
Nu lăsați acest bug să vă strice vacanța de Anul Nou, așa cum a făcut-o pe a mea anul trecut