Charset ja collation MySQL-andmebaasis
Kasuta MySQL-is charset utf8mb4 ja collation utf8mb4_unicode_ci ning vaheta neid phpMyAdmini või ALTER‑käskude kaudu, ära unusta ka SET NAMES‑i ühenduse jaoks.
Charset (tegnsæt) määrab, milliseid märke andmebaas saab salvestada, ja collation määrab, kuidas märgid võrreldakse ja sorteeritakse. Vale charset on kõige sagedasem põhjus, miks taani tähed (æ, ø, å) või emojid kuvatakse küsimärgina või mojibake'na (nt. æ asemel æ).
Soovitatud väärtused
Kasuta utf8mb4 märgistikuna ja utf8mb4_unicode_ci collation'na. utf8mb4 toetab kõiki Unicode-märke, sealhulgas emojisid.
Meetod 1: phpMyAdmin
Muuda kogu andmebaasi vaikeväärtust (kehtib ainult uutele tabelitele):
- Logi sisse phpMyAdmini ja vali andmebaas vasakul pool.
- Klõpsa vahekaardil Operatsioonid.
- Leia jaotis Sorteerimine (Collation).
- Vali
utf8mb4_unicode_cirippmenüüst. - Klõpsa Täida.
Muuda olemasolevat tabelit (kaasa arvatud kõik selle veerud):
- Vali tabel vasakul pool.
- Klõpsa vahekaardil Operatsioonid.
- Jaotises Tabelivalikud vali uus sorteerimine.
- Märgi kastike Muuda ka sorteerimist kõigi veergude jaoks.
- Klõpsa Täida.
Meetod 2: SQL
Muuda andmebaasi vaikeväärtust:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Muuda tabelit ja kõiki selle veerge:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
phpMyAdminis saad muuta märgistikku veeru kaupa: vali tabel, klõpsa Struktuur, klõpsa veeru kõrval Muuda, ja vali uus sorteerimine veerude definitsioonis.
Konverteeri kõik tabelid korraga
Genereeri ALTER-käsud automaatselt:
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';
Käivita tulemus phpMyAdminis vahekaardil SQL või käsurea kaudu.
Ühenduse märgistik (SET NAMES)
Andmebaasi märgistik ja ühenduse märgistik on kaks erinevat asja. Isegi kui sinu tabelid on õigesti seatud utf8mb4-ks, võivad märgid transiidis korrumpeeruda, kui rakenduse ja MySQL-i vaheline ühendus kasutab muud märgistiku.
SET NAMES utf8mb4 seab korraga kolm seansimuutujat:
character_set_client— mida server ootab kliendilt saadacharacter_set_connection— mida server kasutab sisemiselt päringu töötlemiselcharacter_set_results— mida server saadab kliendile tagasi
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Parem praktika: kasuta draiveri sisseehitatud märgistikuvõimalust selle asemel, et saata SET NAMES käsitsi. See tagab, et ka funktsioonid nagu mysqli_real_escape_string() ja PDO::quote() kasutavad õiget märgistiku — muidu võid harva juhtudel avada tee SQL-süstimisele.
Artikkel tugikategooriast: MySQL