Portál AbcLinuxu, 28. října 2025 12:42
character_set_client - znaková sada, ve které jsou data poslána klientemcharacter_set_connection - znaková sada, do které jsou poslaná data od klienta překonvertovánacharacter_set_results - znaková sada, ve které jsou výsledná data zaslána klientovishow 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
--default-character-set=x u mysql klienta a mysqldump odpovídá vykonání: set names x;
[mysqld] v my.cnfcreate database x character set y;create table x ... character set y;... columnx varchar(255) character set y ... _latin1'abc' - tzv. introducershow create table table_name; a pro databázi takto: show create database database_name; .
c_s_client do c_s_connection (nekonvertovány řetězce s introducerem)c_s_connection do znakové sady úložiště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 set a š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;
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;
c_s_connection/znaková sada úložiště. Když máme nastavenou š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;
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;
Dokument vytvořil: razor, 21.2.2007 21:14 | Poslední úprava: DaBler, 30.10.2012 20:19 | Další přispěvatelé: razor | Historie změn | Zobrazeno: 3769×
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.