Puncte:3

#1267 - Combinație ilegală de colări (utf8mb4_0900_ai_ci,COERCIBLE) și (latin1_swedish_ci,IMPLICIT) pentru operațiunea „UNION”

drapel gb

Am actualizat MySQL de la versiunea 5.7 la 8. Am exportat baza de date din vechiul MySQL 5.7 și acum încerc să import baza de date în MySQL 8.Dar primesc o eroare pentru una dintre vizualizările bazei de date cu clauză de unire..

eroarea este -

#1267 - Combinație ilegală de colări (utf8mb4_0900_ai_ci,COERCIBLE) și (latin1_swedish_ci,IMPLICIT) pentru operațiunea „UNION”

priveliștea este -

CREAȚI VIEW_ALL_ORDER_ITEMS_REF AS
  selectați * din VIEW_ORDER_ITEM_EQ_REF
  uniune 
  selectați * din VIEW_ORDER_ITEM_SO_REF
  uniune 
  selectați * din VIEW_ORDER_ITEM_OA_REF
  uniune 
  selectați * din VIEW_ORDER_ITEM_WO_REF
  uniune 
  selectați * din VIEW_ORDER_ITEM_DO_REF

M-am confruntat cu această eroare când încerc să aplic uniunea între mai mult de două puncte de vedere.

această vedere funcționează bine.

aruncați vizualizarea dacă există VIEW_ALL_ORDER_ITEMS_REF;
CREAȚI VIEW_ALL_ORDER_ITEMS_REF AS
  selectați * din VIEW_ORDER_ITEM_EQ_REF
  uniune 
  selectați * din VIEW_ORDER_ITEM_SO_REF

poate cineva ajuta?

drapel in
Cum faci importul de date? Restaurarea dintr-un dump SQL?
rahul shalgar avatar
drapel gb
da............
Puncte:1
drapel in

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:

  1. Inlocuieste CHARSET IMPLICIT la utf8mb4

  2. Inlocuieste COLATEAZĂ la utf8mb4_unicode_ci

  3. (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

rahul shalgar avatar
drapel gb
a funcționat .. mulțumesc mult @matigo .. există vreo opțiune pentru a seta setul de caractere și colarea la nivel global?
drapel in
Puteți seta o colare implicită în `my.cnf`, dar acest lucru poate duce la probleme dacă replicați pe mai multe servere și unul nu are valoarea de colare în fișierul de configurare. Este un caz de margine, dar unul dureros dacă lovește. A fi specific cu declarațiile va economisi multă durere în viitor
rahul shalgar avatar
drapel gb
ok multumesc frate...
rahul shalgar avatar
drapel gb
Nu am proceduri stocate și declanșatoare în baza mea de date.. conține doar tabelele.. în loc să restabilesc baza de date din dump SQL, pot să-mi modific doar toate tabelele din baza de date existentă pentru a schimba setul de caractere și colarea?
drapel in
Poți modifica, da. Rețineți că poate exista text deformat după aceea, deoarece instrucțiunile `ALTER TABLE` și `ALTER COLUMN` nu sunt perfecte atunci când mutați datele între colaționări. Dacă tot textul tău este standard A-Z și 0-9, atunci vei fi bine. Dacă aveți caractere care nu sunt latine, veți dori să testați, să testați și să testați mai multe. Lucrez cu o mulțime de date asiatice, ebraice și arabe și am întâmpinat numeroase probleme de-a lungul anilor când încerc să „economisesc timp”. Reimportarea după modificarea fișierului `.sql` a fost întotdeauna cea mai rapidă pentru bazele de date mai mari de 1 GB

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.