Puncte:1

Upgrade-ul Ubuntu 20.04.2 MySQL ne-a stricat datele... cum se remediază?

drapel mx

Am făcut upgrade de la Ubuntu Server 18.04.5 LTS la Ubuntu Server 20.04.2 LTS. Totul părea în regulă până astăzi când am observat că una dintre aplicațiile noastre nu mai funcționează. MySQL pare să aibă caractere Unicode alterate (stocate ca UTF-8) în baza de date atunci când software-ul bazei de date a fost actualizat.

De exemplu, caracterul UTF-8:

0xF0 0x9F 0x8C 0xB5

A devenit:

0xC3 0xB0 0xC5 0xB8 0xC5 0x92 0xC2 0xB5

Se pare că ceva în timpul actualizării a codificat dublu datele ca UTF-8, chiar dacă datele au fost deja UTF-8 valid.

Setul de caractere de pe masă înainte de actualizare a fost „utf8”. Acum setul de caractere al tabelului este „utf8mb3”.

Nu sunt sigur ce să fac aici pentru a remedia problema.

drapel in
Problema este cu o aplicație Django?
drapel mx
Nu. De asemenea, nu sunt sigur de ce cineva votează negativ acest lucru. Voturile negative sunt doar pentru „nu arată nicio cercetare sau efort, neclar sau neutil”. Nimic din toate acestea nu se aplică. Am făcut cercetări și cel mai bun lucru pe care l-am găsit este: https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table But o singură interogare SQL este departe de o soluție reală. Upgrade-ul la Ubuntu a actualizat MySQL la v8.0 și a schimbat tabelele și datele din ele în așa fel încât să fie rupte.
drapel in
Motivul pentru care am întrebat despre utilizarea Django este pentru că unele sisteme, de exemplu, au așteptări foarte speciale de la motorul DB pe baza configurațiilor de conexiune. Ai spus că acest lucru se întâmplă cu *unul* sistem, nu tuturor, așa că presupunerea că o aplicație rigidă avea nevoie de o actualizare. UTF8 (în MySQL 5.x și versiunile anterioare) a fost depreciat în favoarea Utf8mb4, dar este necesară o reconstrucție a tabelelor pentru a converti tabelele vechi ale bazei de date în setul de caractere curent. Așa cum este întrebarea, există o cantitate insuficientă de detalii pentru a oferi sugestii specifice
drapel mx
Aproape sigur nu se limitează doar la o singură aplicație. Este doar singura aplicație pe care am observat-o până acum, care are tendința de a folosi Unicode (emojis, în special). Datele sunt serializate în baza de date (ceea ce facem o mulțime de date) și deserializatorul trimite datele deoarece MySQL returnează caractere UTF-8 dublu-codate. Utilizarea clientului MySQL în sine arată că datele sunt dublu codificate (adică nu o problemă cu aplicația).
drapel mx
Ideea este că oricine rulează MySQL în Ubuntu Server LTS 18.04 și face upgrade la 20.04 și are tabele în baza de date cu un set de caractere „utf8” se va confrunta cu exact aceeași problemă. Prin urmare, pe deplin relevant și util și are nevoie de o remediere funcțională.
drapel mx
Bine, după ce m-am luptat cu asta ore în șir, am o soluție PARȚIALĂ: mai întâi convertesc setul de caractere din tabel în `utf8mb4` prin `ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4`. Apoi, pentru fiecare coloană afectată, utilizați interogarea SQL din postarea SO pentru a modifica datele din coloană. Faceți toate acestea mai întâi într-un set separat, clonat de tabele de baze de date, pentru a evita să faceți ceva mai rău accidental. Dar, așa cum am spus, aceasta este o soluție parțială, provizorie, care *pare* pentru a face datele valide, dar este departe de un răspuns. Va trebui să construiesc un instrument pentru a identifica cât de răspândită este problema.
drapel mx
Bine, după MULT mai mult timp, am procesat toate datele noastre. Metoda de mai sus funcționează, într-un fel. Recomand *foarte-* să exportați datele folosind o conexiune `utf8`, să faceți upgrade MySQL, să modificați doar câmpurile cu caractere Unicode și apoi să restaurați datele corupte din datele exportate (adică exportul dvs. este corect, MySQL ocazional face greșit). Deoarece https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table VA corupe absolut datele undeva în baza de date! Procesarea a milioane de rânduri de date este modul în care știu că este adevărat.

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.