PC.sk

Počítačová ąkola . sk

Ponuka
Návštevnosť
Všetko pre web

UTF-8 - článok 02 - Nastavenie pre databázu MySQL od verzie 4.1

UTF-8 v MySQL


Databáza MySQL podporuje kódovú stránku UTF-8 od verzie 4.1. Ako default však MySQL používa kódovanie latin1 s triedením znakov (collation) latin1_swedish_ci, preto je potrebné zmeniť kódovanie na strane servera aj na strane klienta.



 1. Na strane servera:

Na strane servera treba v konfiguračnom súbore my.cnf doplniť nasledujúce riadky do sekcie mysqld:

  • [mysqld]
  • character-set-server=utf8
  • collation-server=utf8_slovak_ci

Uvedená úprava spôsobí, že každá novovytvorená databáza bude implicitne používať kódovanie UTF-8 pre všetky objekty.

Pokiaľ databáza beží na serveri kde nie je možné zmeniť default na UTF-8, treba explicitne nastaviť kódovanie pri vytváraní každej databázy:

  • CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_slovak_ci;

 

2. Na strane klienta:

Na strane klienta je potrebné pre každé spojenie určiť používané kódovanie príkazom:

  • SET CHARACTER SET utf8


 <?php
 php mysql_connect();
 mysql_select_db("db_name");
 mysql_query("SET CHARACTER SET utf8");
?>


Kódovanie na strane klienta nemusí byť totožné s kódovaním databázy, čo dáva aplikáciám značnú flexibilitu. Príkazom SET CHARACTER SET možno napr. dočasne zmeniť kódovanie spojenia na 'cp1250' a vložiť do databázy s kódovaním UTF-8 dáta vytvorené v OS Windows. MySQL zabezpečí konverziu do UTF-8 automaticky.

Poznámka: MySQL používa kódovanie latin1 ako default aj na strane klienta. Ak by ste nepoužili príkaz SET CHARACTER SET utf8, databáza by sa snažila vkladané textové reťazce ešte raz konvertovať do UTF-8. Vzniklo by tzv. "dvojité" kódovanie - t.j. každý znak s diakritikou by zaberal namiesto dvoch až 4 bajty a nefungovali by konverzie kódovania ani triedenie podľa abecedy.




Od verzie MySQL 4.1.15 a 5.0.13 možno na strane servera zabezpečiť, aby sa na komunikáciu so všetkými klientmi používalo kódovanie UTF-8 - a to nasledujúcou úpravou súboru my.cnf:

  • [mysqld]
  • character-set-server=utf8
  • collation-server=utf8_slovak_ci
  • skip-character-set-client-handshake

Poznámka: Pri použití uvedeného nastavenia netreba na strane klienta používať príkaz SET CHARACTER SET utf8, takéto aplikácie však nemôžu byť prenesené na server s iným nastavením.




Konverzia existujúcej databázy

MySQL obsahuje od verzie 4.1 priamu podporu pre zmeny kódovania dát. Podmienkou jej úspešného použitia je však súlad deklarovaného kódovania v tabuľkách a stĺpcoch so skutočnosťou.

Pred konverziou databázy do UTF-8 je bezpodmienečne nutné odzálohovať dáta vytvorením exportu a presvedčiť sa, či sú deklarácie kódovania tabuliek správne. Ak boli slovenské dáta vkladané v kódovaní ISO-8859-2, mali by tabuľky obsahovať definíciu 'latin2', v prípade kódovania Windows-1250 definíciu 'cp1250'.

Ak sú definície kódovania správne, zmena kódovania databázy je jednoduchá:

    ALTER DATABASE db_name CHARACTER SET utf8 COLLATE utf8_slovak_ci   

zmení default pre databázu na UTF-8


    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_slovak_ci   

skonvertuje celý obsah zadanej tabuľky do UTF-8.


Pri veľkom množstve tabuliek treba použiť  nasledujúci php skript, ktorý skonvertuje všetky tabuľky v databáze:

Skript: convert.php Parametre: db_name utf8 utf8_slovak_ci

<?php
if ($argc != 4) {
    exit("Usage: php $argv[0] db_name charset collation\n");
}
// Connecting, selecting database
$link = @mysql_connect('loaclhost', 'username', 'password')
    or die('Could not connect: ' . mysql_error());
echo "Connected successfully\n";
mysql_select_db($argv[1]) or die("Could not select database\n");

$charset = $argv[2];
$collation = $argv[3];

function mysql_convert($query) {
    echo "$query;\n";
    return mysql_query($query);
}

mysql_convert("ALTER DATABASE $argv[1] CHARACTER SET $charset COLLATE $collation")
   or die("Invalid charset $charset or collation $collation\n");
$tables = mysql_query("SHOW TABLES");
while ($table = mysql_fetch_row($tables)) {
    mysql_convert("ALTER TABLE $table[0] CONVERT TO CHARACTER SET $charset COLLATE $collation");
}
?>


 

Oprava kódovania databázy

Ak tabuľky obsahujú nesprávnu definíciu kódovania (napr. 'latin1'), je pred samotnou konverziou do UTF-8 nevyhnutné zmeniť kódovanie tabuliek na reálne používané - inak by pri konverzii došlo k zámene znakov. Na to slúži nasledujúci php skript, ktorý opraví nesprávne definície kódovania v tabuľkách:

Skript: fixcharset.php

Použitie s parametrami:

  • db_name latin2_general_ci       
  • db_name cp1250_general_ci

<?php
if ($argc != 3) {
    exit("Usage: php $argv[0] db_name collation\n");
}
// Connecting, selecting database
$link = @mysql_connect('localhost', 'username', 'password')
    or die('Could not connect: ' . mysql_error());
echo "Connected successfully\n";
mysql_select_db($argv[1]) or die("Could not select database\n");

$collation = $argv[2];

function mysql_convert($query) {
    echo "$query;\n";
    return mysql_query($query);
}

mysql_convert("ALTER DATABASE $argv[1] COLLATE $collation")
  or die("Invalid collation $collation\n");
$tables = mysql_query("SHOW TABLES");
while ($table = mysql_fetch_row($tables)) {
    mysql_convert("ALTER TABLE $table[0] COLLATE $collation");
    $columns = mysql_query("SHOW COLUMNS FROM $table[0]");
    while ($column = mysql_fetch_assoc($columns)) {
        if (preg_match('~char|text|enum|set~', $column["Type"])) {
            mysql_convert("ALTER TABLE $table[0] MODIFY $column[Field] $column[Type] CHARACTER SET binary");
            mysql_convert("ALTER TABLE $table[0] MODIFY $column[Field] $column[Type] COLLATE $collation" . ($column["Null"] ? "" : " NOT NULL") . ($column["Default"] && $column["Default"] != "NULL" ? " DEFAULT '$column[Default]'" : ""));
        }
    }
}
?>

 

Skript možno použiť iba v prípade, ak všetky tabuľky používajú rovnaké kódovanie. Po oprave kódovania treba skonvertovať dáta vyššie uvedeným postupom. Ak databáza obsahuje "dvojité" kódovanie UTF-8 v dôsledku nesprávneho nastavenia klienta, je potrebné vyexportovať databázu v kódovaní latin1 - tým sa údaje stanú opäť platnými reťazcami v kódovaní UTF-8. V tomto prípade, ako aj pri iných neštandardných situáciách treba skontrolovať resp. upraviť definície kódovania v exporte textovým editorom, prípadne skonvertovať export príkazom iconv do UTF-8. Samotná konverzia dát sa uskutoční naimportovaním upraveného exportu do novej databázy s kódovaním UTF-8.


[Akt. známka: 0 / Počet hlasov: 0] 1 2 3 4 5