Tre punti in cui MySQL ha bisogno di una codifica
- Colonna o tabella: il set di caratteri con cui sono salvati i dati, come
utf8mb4olatin1. - Connessione: il set di caratteri con cui parlano client e server. Si imposta con
SET NAMES utf8mb4o nelle impostazioni di connessione. - File: la codifica con cui si legge un'importazione o si scrive un'esportazione. In phpMyAdmin si trova in Set di caratteri del file.
Se i tre non combaciano, i caratteri si rompono. Il caso più frequente: testo UTF-8 scritto tramite una connessione latin1 in una colonna latin1. L'applicazione sembra a posto, ma phpMyAdmin e l'export mostrano è.
Prima
"1","Niccolò Perché","Via Garibaldi, località Città Alta 12","Perugia"
Dopo
"1","Niccolò Perché","Via Garibaldi, località Città Alta 12","Perugia"
Controllare i set di caratteri
SHOW VARIABLES LIKE 'character_set%';mostra le impostazioni di server e connessione.SHOW CREATE TABLE clienti;mostra il set di caratteri della tabella e delle sue colonne.SELECT nome, HEX(nome) FROM clienti LIMIT 5;mostra i byte reali: in una colonnautf8mb4,C3A8è unaè, mentreC383C2A8è unègià rotto.
Riparare un export o un dump
- Esporta la tabella in phpMyAdmin come SQL o CSV, oppure con
mysqldump --default-character-set=utf8mb4. - Trascina il file nel riquadro qui sopra. Mojibuster ripara solo i punti rotti; i caratteri corretti restano invariati.
- Controlla i punti riparati in Che cosa è cambiato? e scarica il file.
- Importalo in una tabella
utf8mb4e scegliutf-8come set di caratteri nella finestra di importazione. - Prova prima su una copia, prima di sostituire la tabella vera.
L'export non lascia mai il tuo computer, un aspetto importante con i dati dei clienti. Se il testo è già stato codificato due volte, leggi prima la pagina sulla doppia codifica.
Eliminare la causa
- Crea le nuove tabelle con
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci. - Imposta la connessione della tua applicazione su
utf8mb4; in PHP, per esempio, concharset=utf8mb4nel DSN di PDO. - Se in una colonna
latin1ci sono byte UTF-8, non convertirla direttamente conCONVERT TO: si codifica una seconda volta e nasce un testo con doppia codifica. La via sicura passa da un tipo binario: primaMODIFY nome VARBINARY(255), poiMODIFY nome VARCHAR(255) CHARACTER SET utf8mb4. - Se MySQL sostituisce i caratteri con
?, la colonna o la connessione non riesce a rappresentarli. Ciò che è già stato salvato così è perso; altro in punti interrogativi al posto degli accenti.
Domande frequenti
Perché nella mia applicazione si vede bene ma in phpMyAdmin no?
Perché applicazione e database commettono lo stesso errore due volte: l'applicazione scrive UTF-8 su una connessione latin1 e lo rilegge allo stesso modo. phpMyAdmin si collega correttamente e quindi mostra ciò che è davvero salvato. Se vedi anche sequenze lunghe come è, leggi doppia codifica e WordPress e database.
Quale collation devo usare?
utf8mb4_unicode_ci va bene per la maggior parte delle applicazioni; da MySQL 8 il predefinito è utf8mb4_0900_ai_ci. Conta di più il set di caratteri utf8mb4, non utf8, che in MySQL non può salvare le emoji.
Funziona anche con MariaDB?
Sì. MariaDB gestisce i set di caratteri come MySQL e i comandi sono gli stessi.
Quanto può essere grande il dump?
Fino a 100 MB per file. Esporta i database più grandi tabella per tabella.