Come si presenta il problema
Prima
INSERT INTO wp_posts (post_title) VALUES ('Menù del caffè – novità autunnali');Dopo
INSERT INTO wp_posts (post_title) VALUES ('Menù del caffè – novità autunnali');Da dove viene
WordPress salva il testo come UTF-8. Molte installazioni più vecchie, però, hanno creato le tabelle in latin1 o si sono collegate con latin1. Finché scrittura e lettura commettono lo stesso errore, nessuno se ne accorge. Dopo il passaggio a un nuovo server, un'esportazione con phpMyAdmin o un cambio del set di caratteri della connessione, ogni lettera accentata diventa all'improvviso due caratteri.
DB_CHARSETinwp-config.phpèlatin1oppure non corrisponde alle tabelle.- Il dump è stato esportato come
latin1e importato comeutf8mb4, o viceversa. - Un plugin o uno script di importazione ha convertito ancora una volta un testo già rovinato. Nasce così il testo a doppia codifica come
è.
Riparare l'esportazione
- Fai un backup del database prima di cambiare qualcosa.
- Esporta le tabelle interessate come file
.sql, ad esempio con phpMyAdmin o conmysqldump --default-character-set=utf8mb4. - Trascina il file nel riquadro qui sopra. Mojibuster ripara solo i punti rovinati e ti mostra ogni modifica.
- Scarica il file riparato e importalo con
utf8mb4in un nuovo database di prova. - Controlla il sito. Se tutto è a posto, importalo nel database di produzione.
Il dump non viene mai caricato su alcun server: è importante, perché di solito contiene account utente, indirizzi e-mail e commenti. Altro per le aziende e i responsabili della protezione dei dati.
Attenzione ai dati serializzati
WordPress salva alcune impostazioni in wp_options e wp_postmeta come valori PHP serializzati, ad esempio s:6:"Caffè";. Il numero è la lunghezza in byte. Quando è torna a essere è, la lunghezza non corrisponde più e WordPress scarta il valore. Ripara quindi prima le tabelle dei contenuti come wp_posts, wp_comments e wp_terms. Per le opzioni è meglio wp search-replace di WP-CLI, perché aggiorna le lunghezze.
Correggere la causa in MySQL
- Porta tabelle e connessione a
utf8mb4e impostadefine('DB_CHARSET', 'utf8mb4');inwp-config.php. - Se una colonna
latin1contiene byte UTF-8, non convertirla direttamente: verrebbe codificata una seconda volta. La strada abituale passa da un tipo binario: primaMODIFY … LONGBLOB, poiMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Prova ogni modifica prima su una copia del database.
Domande frequenti
Posso riparare un intero database WordPress in una volta?
Sì, anche dump SQL grandi. Attenzione però ai dati serializzati in wp_options e wp_postmeta: WP-CLI li gestisce meglio.
I caratteri corretti nel dump vengono modificati?
No. Mojibuster ripara solo sequenze chiaramente rovinate. Il testo corretto resta com'è.
Che differenza c'è tra utf8 e utf8mb4?
In MySQL utf8 salva solo caratteri fino a tre byte, quindi le emoji si perdono. utf8mb4 è vero UTF-8 ed è la scelta giusta per WordPress.
Funziona anche con sistemi diversi da WordPress?
Sì. Joomla, Drupal, Magento o la tua applicazione su MySQL o MariaDB hanno lo stesso problema e la stessa soluzione.