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.
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 (𝛑).
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.
Caratteristiche | utf8 | utf8mb4 |
---|---|---|
Byte massimi per carattere | 3 | 4 |
Copertura Unicode | Fino 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 collazione | Limitata | Più estese (ad esempio, utf8mb4_0900_ai_ci) |
Non è possibile memorizzare 🐱, 🧠, 🚀 o 🇩🇪 utilizzando l’utf8 di MySQL. Questi sono al di fuori del BMP.
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)
Con l’espansione di Unicode, i nuovi caratteri non rientrano nell’intervallo dei 3 byte. utf8mb4 assicura che non siate esclusi dai simboli futuri.
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.
Per migrare lo schema in modo sicuro:
Assicurarsi che l’applicazione si connetta utilizzando utf8mb4:
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.
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.