Qual è la differenza tra utf8 e utf8mb4 in MySQL?

Lacodifica dei caratteri è fondamentale per il modo in cui i dati vengono memorizzati, interrogati e resi nelle applicazioni e negli ambienti di hosting moderni. Se state eseguendo un sito web o un’applicazione web su un server di hosting condiviso, VPS o dedicato alimentato da MySQL o MariaDB, è probabile che abbiate incontrato i termini utf8 e utf8mb4. A prima vista, sembrano sinonimi: entrambi rappresentano codifiche Unicode. Ma sotto il cofano, c’è una distinzione fondamentale che può rendere impossibile la memorizzazione di dati di testo moderni come emoji, contenuti multilingue o alcuni caratteri CJK (cinesi, giapponesi, coreani), soprattutto nelle soluzioni di hosting internazionalizzate o multilingue.

Definizioni

utf8

  • La codifica Unicode legacy di MySQL.

  • Supporta solo 3 byte per carattere.

  • Può memorizzare caratteri nel piano multilingue di base (BMP): da U 0000 a U FFFF.

  • Non può memorizzare emoji, simboli musicali, alcuni caratteri cinesi e altri caratteri supplementari.

utf8mb4 (Multi-Byte 4)

  • La vera implementazione di UTF-8.

  • Supporta l ‘intero Unicode, compresi i caratteri al di fuori del BMP.

  • Utilizza fino a 4 byte per carattere, come èstato progettato per UTF-8.

  • È necessario per memorizzare emoji (😊), caratteri cinesi rari (𠀋) o simboli matematici (𝛑).

L’ingannevole utf8 in MySQL

In MySQL, il set di caratteri utf8 non è una completa implementazione dello standard UTF-8. È limitato a 3 byte, mentre lo standard UTF-8 utilizza fino a 4 byte. Ciò significa che:

  • utf8 in MySQL non è il vero UTF-8.

  • È piuttosto un sottoinsieme di UTF-8 che esclude i punti di codice oltre U FFFF.

Al contrario, utf8mb4 è pienamente conforme allo standard UTF-8.

Confronto tecnico

Caratteristicheutf8utf8mb4
Byte massimi per carattere34
Copertura UnicodeFino a U FFFF (solo BMP)Gamma completa (fino a U 10FFFF)
Supporto Emoji❌ No✅ Sì
Supporto dei caratteri supplementari❌ No✅ Sì
Compatibilità con MySQL✅ A prova di eredità✅ Unicode completo
Opzioni di collazioneLimitataPiù estese (ad esempio, utf8mb4_0900_ai_ci)

Perché utf8mb4 è la scelta giusta

1. Supporto per emoji e simboli moderni

Non è possibile memorizzare 🐱, 🧠, 🚀 o 🇩🇪 utilizzando l’utf8 di MySQL. Questi sono al di fuori del BMP.

2. Migliore fascicolazione e ordinamento

utf8mb4 supporta nuovi ordinamenti come:

  • utf8mb4_unicode_ci: Ordinamento standard Unicode

  • utf8mb4_general_ci: Veloce ma meno preciso

  • utf8mb4_0900_ai_ci: collazione moderna che tiene conto di Unicode 9.0 (disponibile in MySQL 8)

3. Protezione per il futuro

Con l’espansione di Unicode, i nuovi caratteri non rientrano nell’intervallo dei 3 byte. utf8mb4 assicura che non siate esclusi dai simboli futuri.

Cosa succede se si usa utf8?

Se si tenta di inserire un carattere a 4 byte (come un emoji) in una colonna con , si otterrà questo errore:

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x81' for column 'title' at row 1

Peggio ancora, la vostra applicazione potrebbe troncare o corrompere silenziosamente i dati se non viene convalidata correttamente.

Migrazione da utf8 a utf8mb4

Per migrare lo schema in modo sicuro:

Passo 1: aggiornare le definizioni di tabelle e colonne

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Passo 2: aggiornare le impostazioni predefinite del database

ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Passo 3: aggiornare le impostazioni di connessione dell’applicazione

Assicurarsi che l’applicazione si connetta utilizzando utf8mb4:

SET NAMES utf8mb4;

Migliori pratiche

  • usare sempre utf8mb4 per i nuovi database.

  • ✅ Usare utf8mb4_unicode_ci per la precisione o utf8mb4_general_ci per le prestazioni.

  • ✅ Impostare il set di caratteri predefinito a livello di tabella e di database.

  • ✅ Assicurarsi che le librerie del livello applicativo (ad esempio, PDO, MySQLi, Sequelize) supportino utf8mb4.

Conclusione

La differenza tra utf8 e utf8mb4 in MySQL è più di un byte: è la differenza tra la moderna compatibilità Unicode e il fallimento silenzioso. Sebbene utf8 rimanga compatibile con le versioni precedenti, è deprecato per molti casi d’uso moderni. Preferite sempre utf8mb4 per essere a prova di futuro e per garantire un supporto completo a multilingua, emoji e simboli speciali.