Simply.com is available in english

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):

  1. Logi sisse phpMyAdmini ja vali andmebaas vasakul pool.
  2. Klõpsa vahekaardil Operatsioonid.
  3. Leia jaotis Sorteerimine (Collation).
  4. Vali utf8mb4_unicode_ci rippmenüüst.
  5. Klõpsa Täida.

Muuda olemasolevat tabelit (kaasa arvatud kõik selle veerud):

  1. Vali tabel vasakul pool.
  2. Klõpsa vahekaardil Operatsioonid.
  3. Jaotises Tabelivalikud vali uus sorteerimine.
  4. Märgi kastike Muuda ka sorteerimist kõigi veergude jaoks.
  5. 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 saada
  • character_set_connection — mida server kasutab sisemiselt päringu töötlemisel
  • character_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

Muud asjakohased artiklid