dvestezar.cz

  • Increase font size
  • Default font size
  • Decrease font size
Home Články MySQL MySQL kódování

MySQL kódování

Email Tisk PDF

Při problémech s MySQL kódováním je dobré nastavit před použitím dotazů na stránce tyto řádky s potřebným kódováním. Bohužel nic není tak jednoduché jak se udá a proto je lepší dělat od začátku dokonce vš v UTF.

dtb.execute("set character set 'cp1250'")
dtb.execute("set names cp1250")
dtb.execute("set character_set_client = cp1250")
dtb.execute("set character_set_results = cp1250")
dtb.execute("set character_set_connection = cp1250")

 

 

převzato z

Znakové sady pro komunikaci klienta se serverem a znakové sady pro uložení dat

Při problému se znakovou sadou je podstatné rozlišovat znakové sady pro:
  • komunikaci klienta se serverem
  • samotné uložení dat
ad a)Použité znakové sady při komunikaci server/klient ovlivňují 3 proměnné:
  • character_set_client - znaková sada v které jsou data poslána klientem
  • character_set_connection - znaková sada do které jsou poslaná data od klienta překonvertována
  • character_set_results - znaková sada v které jsou výsledná data zaslána klientovy
vypsat proměnné související se znakovými sadami lze takto: show variables like '%character%';Pro nastavení výše uvedených proměnných existují "zkratky":
  • set names x;je ekvivalentní (nezmiňuji nastavení collation):
    
    set character_set_client = x;
    set character_set_results = x;
    set character_set_connection = x;
    
  • set character set x;je ekvivalentní (nezmiňuji nastavení collation):
    
    set character_set_client = x;
    set character_set_results = x;
    set character_set_connection = @@character_set_database
    
  • parametr --default-character-set=x u mysql klienta a mysqldump odpovídá vykonání: set names x;
ad b)Znaková sada pro uložení dat se dá nastavit pro:
  • server - nastavení typicky v sekci [mysqld] v my.cnf
  • databázi - nastavení typicky při tvorbě databáze: create database x character set y;
  • tabulku - nastavení typicky při tvorbě tabulky: create table x ... character set y;
  • sloupec - nastavení typicky při tvorbě tabulky: ... columnx varchar(255) character set y ...
  • řetězec - např. _latin1'abc' - tzv. introducer
ověřit nastavení znakových sad lze pro tabulku a sloupce takto: show create table table_name; a pro databázi takto: show create database database_name;.

Schematický popis zpracování dat - konverze znakových sad

c_s je zkratkou pro: character_set
  1. klient pošle data serveru
  2. server provede konverzi z c_s_client do c_s_connection (nekonvertovány řetězce s introducerem)
  3. server provede konverzi z c_s_client do znakové sady úložiště
  4. server data uloží

Možné chyby

Z toho vyplývají následující možné chyby: Předpoklad: řetězec "příliš žluťoučký kůň" je kódován v utf8
  • špatná proměnná c_s_connection - chyba při konverzi c_s_client/c_s_connection. Příklad ukazuje možné úskalí při použití set character seta špatně nastavené znakové sady pro databázi.
    
    create database c_s_test character set latin1; 
    use c_s_test;
    create table t1 (data varchar(255)) character set utf8;
    /* znaková sada pro tabulku je utf8 */
    set character set utf8; 
    /* c_s_connection je stále nastavené na latin1 */
    insert into t1 values('příliš žluťoučký kůň');
    select convert(data using utf8) = _utf8'příliš žluťoučký kůň' from t1 limit 1;
    /* chyba - nerovnají se*/
    drop database c_s_test;
    
  • špatná proměnná c_s_client - chyba při konverzi c_s_client/c_s_connection. Data pošleme serveru ve špatném kódování.
    
    create database c_s_test character set utf8; 
    use c_s_test;
    create table t1 (data varchar(255)) character set utf8;
    set names utf8; 
    set character_set_client = latin1;
    /* c_s_client je nastaveno na latin1 */
    insert into t1 values('příliš žluťoučký kůň');
    select convert(data using utf8) = _utf8'příliš žluťoučký kůň' from t1 limit 1;
    /* chyba - nerovnají se*/
    drop database c_s_test;
    
  • Chyba při konverzi c_s_connection/znaková sada úložiště. Když máme nastevnou špatnou znakovou sadu pro tabulku, tak to taky není ono.
    
    create database c_s_test character set utf8; 
    use c_s_test;
    create table t1 (data varchar(255)) character set latin1;
    /* znaková sada pro tabulku je latin1 */
    set names utf8; 
    insert into t1 values('příliš žluťoučký kůň');
    select convert(data using utf8) = _utf8'příliš žluťoučký kůň' from t1 limit 1;
    /* chyba - nerovnají se*/
    drop database c_s_test;
    
  • Špatně nastavená proměnná c_s_results. Porovnání řetězců tentokrát vrátí 1 - data jsou uložena a zpracována bez chyb při konverzi. Schválně je nastavena jiná znaková sada pro character_set_connection. Dochází ke konverzi utf8 -> latin2 -> utf8. Pro tabulku můžete případně zvolit latin2 znakovou sadu a výsledek bude též správný. Výsledkem druhého selectu je ovšem špatná diakritika kvůli špatně nastavené proměnné c_s_results.
    
    create database c_s_test character set utf8; 
    use c_s_test;
    create table t1 (data varchar(255)) character set utf8;
    set names utf8;
    set character_set_connection = latin2;
    set character_set_results = latin1;
    insert into t1 values('příliš žluťoučký kůň');
    select convert(data using utf8) =  _utf8'příliš žluťoučký kůň' from t1 limit 1;
    /* OK vrátí 1*/
    select convert(data using utf8) from t1 limit 1;
    /* výsledkem je špatná diakritika */
    drop database c_s_test;
    
Aktualizováno Sobota, 08 Červen 2013 07:06