Cosa sono i set di caratteri e le collation in MySQL?
Quando WordPress archivia i contenuti del tuo sito nel database (come articoli, titoli, stringhe tradotte, ecc.), utilizza un set di caratteri per rappresentare i caratteri e una collation per definire come questi caratteri vengono confrontati e ordinati.
- Set di caratteri (charset)
- Definisce come vengono archiviati i caratteri nel database, essenzialmente quali byte rappresentano quali caratteri.
- Collation
- Definisce le regole per confrontare quei caratteri (ad esempio, la sensibilità alle maiuscole, agli accenti e l'ordine di ordinamento).
Perché è importante per i siti multilingue
WPML supporta contenuti multilingue, che spesso includono:
- Caratteri speciali (ad es. ñ, é, ö)
- Alfabeti non latini (ad es. arabo, giapponese, cinese, ebraico)
- Emoji e simboli (🎉, ✔️, ecc.)
Molti di questi richiedono più di 3 byte per essere archiviati correttamente. Se il tuo database utilizza una collation incompatibile, i caratteri potrebbero andare persi, essere sostituiti con � o generare errori del database (ad esempio, “Incorrect string value”).
Ecco perché consigliamo vivamente di utilizzare una collation che supporti i caratteri Unicode a 4 byte.
La nostra raccomandazione
Usa il set di caratteri utf8mb4 e una collation compatibile con Unicode, come:
- utf8mb4_unicode_ci: ampiamente compatibile, un buon valore predefinito
- utf8mb4_unicode_520_ci: migliore gestione di Unicode su MySQL 5.6+
- utf8mb4_general_ci: leggermente più veloce, ma con un confronto Unicode meno accurato
- utf8mb4_bin: sensibile alle maiuscole e agli accenti (confronto binario)
Tutte queste sono sicure da usare con WPML.
Importante: il vecchio set di caratteri utf8 in MySQL supporta solo fino a 3 byte per carattere. Non può gestire alcuni caratteri come le emoji o alcuni ideogrammi. Evita di usarlo per i contenuti multilingue.
Qual è il valore predefinito in MySQL?
| Versione di MySQL | Charset predefinito | Collation predefinita | Compatibile con Unicode |
|---|---|---|---|
| < 5.5 | latin1 | latin1_swedish_ci | No |
| 5.5.x | utf8 | utf8_general_ci | No |
| 5.7+ | utf8mb4 | utf8mb4_general_ci / utf8mb4_unicode_ci | Sì |
| 8.0+ | utf8mb4 | utf8mb4_0900_ai_ci | Sì |
WordPress potrebbe non seguire sempre le impostazioni predefinite di MySQL: può sovrascriverle tramite la configurazione o le migrazioni.
Impostare il charset e la collation per i nuovi siti
Per assicurarti che WordPress crei nuove tabelle con il set di caratteri e la collation corretti, definisci quanto segue nel tuo file wp-config.php:
define( 'DB_CHARSET', 'utf8mb4' ); // If you have utf8 that's fine, WP will automatically map it as utf8mb4 define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );
Questo si applicherà alle nuove installazioni e alle tabelle appena create.
Controllare il charset e la collation per i siti e le tabelle esistenti
Ecco come controllare il set di caratteri e la collation sui tuoi siti esistenti.
Opzione 1 phpMyAdmin
- Vai al database del tuo sito.
- Controlla la colonna “Collation” accanto a ogni tabella.
- Fai clic su una tabella per visualizzare la collation individuale di ogni colonna.
Opzione 2 WP-CLI
bash
wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = 'your_db_name';"
Puoi anche ispezionare le singole colonne:
bash
wp db query "SHOW FULL COLUMNS FROM wp_posts;"
Se vedi che la collation inizia con utf8mb4_, allora è pronta per supportare tutti i tipi di Unicode e gli ideogrammi a 4 byte. Anche il set di caratteri va bene.
Se vedi qualcos'altro, ad esempio utf8_*, allora devi cambiarla.
Tieni presente che la collation può essere diversa per ogni colonna.
Aggiornare il charset e la collation per le tabelle e le colonne esistenti
L'aggiornamento delle costanti DB_CHARSET e DB_COLLATE nel tuo file wp-config.php ha effetto solo sulle nuove tabelle. Per applicare le modifiche alle tabelle e alle colonne esistenti, devi convertirle manualmente utilizzando SQL.
Consigliamo anche di aggiornare la collation predefinita di MySQL del database utilizzando il seguente comando:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Inizia sempre con un backup
Prima di eseguire qualsiasi query di conversione:
- Esporta il tuo database utilizzando phpMyAdmin o mysqldump
- Conservalo in un luogo sicuro nel caso in cui qualcosa vada storto
Attenzione: gli aggiornamenti della collation potrebbero fallire in strict mode
Quando si aggiorna la collation di un'intera tabella (o database), MySQL potrebbe ricostruire le tabelle e riconvalidare tutti i valori predefiniti delle colonne, inclusi quelli non correlati come DATETIME. Se il tuo database è in esecuzione in modalità strict SQL (STRICT_TRANS_TABLES, NO_ZERO_DATE), le colonne con valori predefiniti come ‘0000-00-00 00:00:00’ genereranno errori come:
#1067 - Invalid default value.
Cos'è la strict mode?
La strict mode controlla il modo in cui MySQL gestisce i valori non validi o mancanti quando i dati vengono aggiunti o aggiornati nel database. Un valore può non essere valido per diversi motivi. Ad esempio, potrebbe avere il tipo di dati errato per la colonna o potrebbe essere fuori intervallo.
Puoi trovare informazioni sui diversi tipi di convalida dei dati per la strict mode nella documentazione di MySQL.
Come la strict mode influisce sul database di un sito web WordPress
Per impostazione predefinita, WordPress utilizza ‘0000-00-00 00:00:00’ come valore predefinito per alcune colonne datetime, il che non è accettato dalla strict mode NO_ZERO_DATE.
Tieni presente che questi valori predefiniti erano consentiti durante la creazione originale della tabella (ad esempio, durante la configurazione di WordPress), ma falliscono in caso di operazioni ALTER in ambienti strict.
Come verificare se la strict mode è abilitata
Esegui il seguente comando:
SELECT @@SESSION.sql_mode, @@GLOBAL.sql_mode;
Cerca:
- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
- NO_ZERO_DATE
Se trovi uno di questi, la strict mode è abilitata.
Per evitare errori durante gli aggiornamenti del set di caratteri e della collation, devi solo disabilitare la strict mode NO_ZERO_DATE.
Come procedere in sicurezza
Fai una delle seguenti operazioni per procedere in sicurezza:
1. Evita di alterare colonne e tabelle a meno che la collation non debba effettivamente essere modificata.
2. Disabilita temporaneamente la strict mode solo per la sessione durante l'esecuzione delle query di conversione. Puoi farlo utilizzando il seguente comando:
SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');
Nota: ci sono piani futuri per MySQL per unire le strict mode.
In caso di altri problemi specifici dei tuoi dati, potresti voler disabilitare qualsiasi strict mode utilizzando il seguente comando:
SET SESSION sql_mode = '';
Query per la conversione dei dati
Convertire l'intero database
Quanto segue genera una query ALTER TABLE per ogni tabella del tuo database:
SELECT CONCAT( 'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) AS query FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
Esegui le query risultanti in phpMyAdmin, oppure copiale e incollale nella CLI di MySQL / WP-CLI.
Questo garantisce che tutte le tabelle nel tuo database adottino il nuovo charset e la nuova collation.
Convertire una tabella specifica Opzionale/Accessorio
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Questo aggiorna tutte le colonne di testo nella tabella wp_posts per utilizzare utf8mb4 e la collation specificata.
Convertire una colonna specifica Opzionale/Accessorio
ALTER TABLE wp_posts CHANGE post_title post_title TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Nota:
- Devi ridichiarare completamente la colonna (tipo, nome) in CHANGE.
- Assicurati che il tipo di colonna corrisponda a quello esistente.
Errori comuni durante la conversione
Ecco due errori comuni che potresti riscontrare durante la conversione di tabelle e colonne.
Charset e collation non corrispondenti
-- INVALID: utf8 collation with utf8mb4 charset ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci; -- Error: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'
Soluzione:
- Usa una collation corrispondente: utf8mb4_*
Limite di lunghezza della chiave di indice
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
In alcune configurazioni, specialmente per le versioni di MySQL precedenti alla 5.7, la lunghezza massima della chiave di indice potrebbe essere superata quando si aggiunge un byte in più per carattere.
Soluzione:
- Se necessario, accorcia VARCHAR(255) indicizzato a VARCHAR(191)
- Oppure esegui l'upgrade a MySQL 5.7+ e assicurati che innodb_large_prefix sia abilitato
Riepilogo
- Usa il set di caratteri utf8mb4 per il supporto completo a Unicode
- Usa collation compatibili: utf8mb4_unicode_ci, utf8mb4_0900_ai_ci, ecc.
- Aggiorna wp-config.php per le nuove tabelle
- Esegui le migrazioni SQL per correggere le tabelle esistenti
- Non mescolare mai set di caratteri e collation: MySQL li rifiuterà o li danneggerà.