Codificarea caracterelor este fundamentală pentru modul în care datele sunt stocate, interogate și redate în aplicațiile și mediile de găzduire moderne. Dacă rulați un site web sau o aplicație web pe un server de găzduire partajată, VPS sau dedicat alimentat de MySQL sau MariaDB, probabil ați întâlnit termenii utf8 și utf8mb4. La prima vedere, acestea par sinonime – ambele reprezintă codificări Unicode. Dar, sub capotă, există o distincție esențială care poate face sau desface capacitatea aplicației dvs. de a stoca date text moderne, cum ar fi emoji, conținut multilingv sau anumite caractere CJK (chineză, japoneză, coreeană) – în special în soluții de găzduire internaționalizate sau multilingve.
utf8
Codificarea Unicode moștenită de MySQL.
Suportă doar 3 octeți per caracter.
Capabilă să stocheze caractere în planul multilingv de bază (BMP): de la U 0000 la U FFFF.
Nu poate stoca emoji, simboluri muzicale, anumite caractere chinezești și alte caractere suplimentare.
utf8mb4
(Multi-Byte 4)Implementarea UTF-8 reală.
Suportă Unicode complet, inclusiv caracterele din afara BMP.
Utilizează până la 4 octeți per caracter, așa cum a fost conceput UTF-8.
Necesară pentru stocarea emoji (😊), caractere chinezești rare (𠀋) sau simboluri matematice (𝛑).
În MySQL, setul de caractere utf8 nu este o implementare completă a standardului UTF-8. Acesta este limitat la 3 octeți, în timp ce standardul UTF-8 utilizează până la 4 octeți. Aceasta înseamnă că:
utf8 în MySQL nu este UTF-8 real.
Este mai degrabă un subset al UTF-8 care exclude punctele de cod dincolo de U FFFF.
Prin contrast, utf8mb4 respectă pe deplin standardul UTF-8.
Caracteristică | utf8 | utf8mb4 |
---|---|---|
Numărul maxim de octeți per caracter | 3 | 4 |
Acoperire Unicode | Până la U FFFF (numai BMP) | Gama completă (până la U 10FFFF) |
Suport emoji | ❌ Nu | ✅ Da |
Suport pentru caractere suplimentare | ❌ Nu | ✅ Da |
Compatibilitate MySQL | ✅ Legacy-safe | ✅ Unicode complet |
Opțiuni de colaționare | Limitate | Mai extinse (de exemplu, utf8mb4_0900_ai_ci) |
Nu puteți stoca 🐱, 🧠, 🚀 sau 🇩🇪 utilizând MySQL’s utf8. Acestea sunt în afara BMP.
utf8mb4 suportă colări mai noi, cum ar fi:
utf8mb4_unicode_ci: Sortare standard Unicode
utf8mb4_general_ci: Rapidă, dar mai puțin precisă
utf8mb4_0900_ai_ci: colaționare modernă care ține cont de Unicode 9.0 (disponibilă în MySQL 8 )
Pe măsură ce Unicode se extinde, caractere noi vor ieși din intervalul de 3 octeți. utf8mb4 vă asigură că nu sunteți blocat în afara simbolurilor viitoare.
Dacă încercați să introduceți un caracter de 4 octeți (cum ar fi un emoji) într-o coloană cu , veți primi această eroare:
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x81' for column 'title' at row 1
Mai rău, aplicația dvs. ar putea trunchia silențios sau corupe datele dacă nu sunt validate corespunzător.
Pentru a vă migra schema în siguranță:
Asigurați-vă că aplicația dvs. se conectează utilizând utf8mb4:
✅ Utilizați întotdeauna utf8mb4 pentru baze de date noi.
✅ Utilizați utf8mb4_unicode_ci pentru acuratețe sau utf8mb4_general_ci pentru performanță.
✅ Setați setul de caractere implicit la nivelul tabelelor și al bazelor de date.
✅ Asigurați-vă că bibliotecile stratului de aplicații (de exemplu, PDO, MySQLi, Sequelize) acceptă utf8mb4.
Diferența dintre utf8 și utf8mb4 în MySQL este mai mult decât un byte – este diferența dintre compatibilitatea Unicode modernă și eșecul silențios. În timp ce utf8 rămâne retrocompatibil, acesta este depreciat pentru multe cazuri de utilizare moderne. Preferați întotdeauna utf8mb4 pentru a vă proteja aplicația pentru viitor și pentru a asigura suport multilingv complet, pentru emoji și pentru simboluri speciale.