Folosiți charset utf8mb4 și collation utf8mb4_unicode_ci în MySQL și schimbați-le prin phpMyAdmin sau comenzi ALTER, amintiți-vă și de SET NAMES pentru conexiune.
Charset (setul de caractere) determină ce caractere poate salva baza de date, iar collation determină cum sunt comparate și sortate caracterele. Un charset incorect este cea mai frecventă cauză pentru ca literele daneze (æ, ø, å) sau emoji-urile să apară ca semne de întrebare sau mojibake (de exemplu æ în loc de æ).
Folosește utf8mb4 ca charset și utf8mb4_unicode_ci ca collation. utf8mb4 suportă toate caracterele Unicode, inclusiv emoji-urile.
Schimbă setarea implicită pentru întreaga bază de date (se aplică numai tabelelor noi):
utf8mb4_unicode_ci din meniul derulant.Schimbă un tabel existent (incluzând toate coloanele sale):
Schimbă setarea implicită a bazei de date:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Schimbă un tabel și toate coloanele sale:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
În phpMyAdmin poți modifica charset-ul pe coloană: selectează tabelul, dă click pe Structură, dă click pe Schimbă lângă coloană și selectează noua sortare în definiția coloanei.
Generează comenzile ALTER automat:
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';
Rulează rezultatul în phpMyAdmin pe fila SQL sau prin linia de comandă.
Charset-ul bazei de date și charset-ul conexiunii sunt două lucruri diferite. Chiar dacă tabelele tale sunt setate corect la utf8mb4, caracterele pot deveni corupte în tranzit, dacă conexiunea dintre aplicație și MySQL folosește un alt charset.
SET NAMES utf8mb4 setează trei variabile de sesiune simultan:
character_set_client — ce așteaptă serverul să primească de la clientcharacter_set_connection — ce folosește serverul intern în timpul procesării interogăriicharacter_set_results — ce trimite serverul înapoi către clientSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Practica recomandată: folosește opțiunea de charset încorporată a driverului în loc să trimiți manual SET NAMES. Aceasta asigură că și funcțiile precum mysqli_real_escape_string() și PDO::quote() utilizează charset-ul corect — în caz contrar, în situații rare, poți deschide vulnerabilități de tip SQL‑injection.
Articol din categoria de suport: MySQL