Charset e collation in un database MySQL
Usa il charset utf8mb4 e la collation utf8mb4_unicode_ci in MySQL e cambiali tramite phpMyAdmin o i comandi ALTER, ricorda anche SET NAMES per la connessione.
Charset (set di caratteri) determina quali caratteri può memorizzare il database, e la collation determina come i caratteri vengono confrontati e ordinati. Un charset errato è la causa più frequente per cui le lettere danesi (æ, ø, å) o le emoji vengono visualizzate come punti interrogativi o mojibake (ad esempio æ al posto di æ).
Valori consigliati
Usa utf8mb4 come charset e utf8mb4_unicode_ci come collation. utf8mb4 supporta tutti i caratteri Unicode inclusi le emoji.
Metodo 1: phpMyAdmin
Modifica il valore predefinito per l'intero database (vale solo per le nuove tabelle):
- Accedi a phpMyAdmin e seleziona il database nella barra sinistra.
- Clicca sulla scheda Operazioni.
- Trova la sezione Ordinamento (Collation).
- Seleziona
utf8mb4_unicode_cidal menu a discesa. - Clicca Esegui.
Modifica una tabella esistente (incluse tutte le sue colonne):
- Seleziona la tabella nella barra sinistra.
- Clicca sulla scheda Operazioni.
- Nella sezione Opzioni tabella scegli il nuovo ordinamento.
- Spunta Modifica anche l'ordinamento per tutte le colonne.
- Clicca Esegui.
Metodo 2: SQL
Modifica il valore predefinito del database:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Modifica una tabella e tutte le sue colonne:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
In phpMyAdmin puoi modificare il charset per colonna: seleziona la tabella, clicca su Struttura, clicca su Modifica accanto alla colonna e scegli il nuovo ordinamento nella definizione della colonna.
Converti tutte le tabelle in una volta
Genera automaticamente i comandi ALTER:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Esegui il risultato in phpMyAdmin nella scheda SQL o tramite la riga di comando.
Charset della connessione (SET NAMES)
Il charset del database e il charset della connessione sono due cose diverse. Anche se le tue tabelle sono impostate correttamente su utf8mb4, i caratteri possono corrompersi in transito se la connessione tra l'applicazione e MySQL utilizza un charset diverso.
SET NAMES utf8mb4 imposta tre variabili di sessione contemporaneamente:
character_set_client— cosa il server si aspetta di ricevere dal clientcharacter_set_connection— cosa il server usa internamente durante l'elaborazione delle querycharacter_set_results— cosa il server restituisce al client
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Buona pratica: utilizza l'opzione charset integrata del driver invece di inviare manualmente SET NAMES. Questo garantisce che anche funzioni come mysqli_real_escape_string() e PDO::quote() utilizzino il charset corretto — altrimenti, in rari casi, potresti esporre a vulnerabilità di SQL injection.
Articolo dalla categoria di supporto: MySQL