MySQL si Unicode folosind UTF-8

Read this post in English

Share on:

O data cu globalizarea, batranul cod ASCII nu mai este potrivit. Ganditi-va ca intr-o buna zi trebuie sa dezvoltati un proiect in germana, rusa sau chiar japoneza, puteti adapta characterset-ul pentru fiecare din aceste limbi sau puteti pur si simplu sa-l dezvoltati folosind Unicode.

Pentru a folosi Unicode cu MySQL se poate folosi UTF-8.

Trebuie sa retineti ca caracterele UTF-8 au o marime variabila si sunt compatibile ASCII. In ASCII 1 caracter = 1B, in UTF-8 1 caracter poate avea intre 1 si 4 B.

Charset si collation UTF-8 pe server

In MySQL tipul caracterelor este dictat de charset.

Pentru a vedea daca este instalat pe server:

1SHOW CHARSET LIKE 'utf8';

sau cu information_schema

1SELECT * FROM `CHARACTER_SETS` WHERE CHARACTER_SET_NAME = 'utf8';

Daca a fost gasit charset-ul atunci putem continua.

Un alt element care apare la charset este collation, acesta se foloseste in comparatii intre string-uri la ordonare.

Pentru a vedea ce “collation” sunt disponibile pe server:

1SHOW COLLATION WHERE CHARSET = 'utf8';

sau cu information_schema

1SELECT * FROM `COLLATIONS` WHERE CHARACTER_SET_NAME = 'utf8';

Collation este in functie de limba in principiu, pentru a putea compara stringuri cu sau fara diacritice de exemplu, sau se mai poate folosi cel “bin” care va face ordonarea in mod binar, adica “A” este mai mare decat “a” de exemplu.

Daca nu se va specifica collation, atunci se va folosi cel marcat ca default.

UTF-8 si baza de date

La crearea unei baze de date se poate specifica charset-ul default care se va folosi la toate tabelele noi la care nu este specificat charset-ul.

De exemplu:

1CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_romanian_ci;

Sau pentru a modifica characterset-ul default la o baza de data deja existenta:

1ALTER DATABASE db_name CHARACTER SET utf8 COLLATE utf8_romanian_ci;

UTF-8, tabelele si coloanele

Pentru a modifica tabelele deja existente se foloseste ALTER TABLE.

Un tabel poate avea un charset si un collation default iar fiecare coloana poate avea propriul charset si collation.

Pentru a vedea mai multe detalii despre un tabel se pot folosi:

1SHOW CREATE TABLE tab;

Pentru a seta un charset pe un table existent:

1ALTER TABLE tab CHARSET = utf8 COLLATE = utf8_romanian_ci;

Pentru a modifica charset-ul pe o coloana de timpul VARCHAR(200) se foloseste:

1ALTER TABLE tab MODIFY c1 VARCHAR(200) CHARSET utf8 COLLATE utf8_romanian_ci;

Marimea stringurilor

O “problema” care poate aparea este legata de marimea unui caracter, acesta poate avea marimea intre 1 si 4B. De asta pentru masurarea unui camp care are un string (cum ar fi un varchar) trebuie folosita CHAR_LENGTH(str) si nu LENGTH().

Un mic exemplu:

1SET @var = 'aşadar';
2SELECT CHAR_LENGTH(@var) AS 'Char', LENGTH(@var) AS 'Length';
3
4// Rezulta: Char = 6 si Length = 7 pentru ca ş ocupa 2B