Simply.com is available in english

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):

  1. Accedi a phpMyAdmin e seleziona il database nella barra sinistra.
  2. Clicca sulla scheda Operazioni.
  3. Trova la sezione Ordinamento (Collation).
  4. Seleziona utf8mb4_unicode_ci dal menu a discesa.
  5. Clicca Esegui.

Modifica una tabella esistente (incluse tutte le sue colonne):

  1. Seleziona la tabella nella barra sinistra.
  2. Clicca sulla scheda Operazioni.
  3. Nella sezione Opzioni tabella scegli il nuovo ordinamento.
  4. Spunta Modifica anche l'ordinamento per tutte le colonne.
  5. 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 client
  • character_set_connection — cosa il server usa internamente durante l'elaborazione delle query
  • character_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

Altri articoli rilevanti