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 æ).
Usa utf8mb4 come charset e utf8mb4_unicode_ci come collation. utf8mb4 supporta tutti i caratteri Unicode inclusi le emoji.
Modifica il valore predefinito per l'intero database (vale solo per le nuove tabelle):
utf8mb4_unicode_ci dal menu a discesa.Modifica una tabella esistente (incluse tutte le sue colonne):
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.
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.
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 clientSET 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