MySQL (58) - čeština v praxi
Příliš žluťoučcí koně - prostě hrátky s nabodeníčky stokrát jinak a pokaždé s MySQL.
10.2.2006 06:00 |
Petr Zajíc
| Články autora
| přečteno 39076×
Teorie bylo minule až dost, takže vzhůru na praktické uplatnění
vědomostí o MySQL a znakových sadách.
Definice sloupce tabulky
Především je třeba vědět, že při definici tabulky lze v MySQL určit
znakovou sadu a řazení pro každý sloupec zvlášť. V jediné tabulce tedy
můžete mít sloupce s různým kódováním znaků. Příkaz, který to zajistí
lze napsat nějak takto:
CREATE TABLE cestina (
win VARCHAR(50) CHARACTER SET cp1250 COLLATE cp1250_czech_cs,
latin VARCHAR(50) CHARACTER SET latin2 COLLATE latin2_czech_cs,
utf VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_czech_ci
) TYPE = MYISAM ;
Samozřejmě, že v reálné aplikaci to většinou nebudete potřebovat.
Tam často postačí definovat znakovou sadu pro celou tabulku, a tato
znaková sada je
pak použita pro všechny sloupce obsahující řetězce.
CREATE TABLE
cestina_cela (
text1 VARCHAR( 50 ) NOT NULL ,
text2 VARCHAR( 50 ) NOT NULL ,
text3 VARCHAR( 50 ) NOT NULL
) TYPE = MYISAM CHARACTER SET utf8 COLLATE utf8_czech_ci;
Leč zpátky k prvnímu příkladu. Pokud se nyní do tabulky cestina pokusíte zapsat data
následujícím příkazem:
insert into cestina
(win, latin, utf) values ('Příliš žluťoučký kůň pěl ďábelské
ódy','Příliš žluťoučký kůň pěl ďábelské ódy','Příliš žluťoučký kůň pěl
ďábelské ódy');
Skončíte na 99% chybovým hlášením "Data too long for column 'win' at
row 1", nebo něčím hodně podobným. Než se to pokusím vysvětlit, je
třeba uvést, že:
- V příkladech předpokládám použití řádkového klienta mysql. Pokud
byste použili například PhpMyAdmin tak nejspíš k žádné chybě nedojde,
protože aplikace se pokusí kódování nějak
vyřešit (a nejspíš uspěje). To nám momentálně VADÍ, protože
to ztěžuje pochopení našeho problému. Při použití řádkového klienta
máme naopak jistotu, že do databáze dorazí přesně to, co jsme napsali.
- Chybová hláška je v tomto případě naprosto zavádějící. Ve
skutečnosti je problém v tom, že klient a server vzájemně "nepochopili"
svoje znakové sady.
Client character set
Jakou znakovou sadu tedy vlastně používá řádkový klient mysql, když
"mluví" s databází? A vůbec - nějakou znakovou sadu přece musí používat
jakýkoli klient, řádkovým počínaje a třeba PHP skriptem konče, takže
jak to je? Odpověď je jednoduchá - server PŘEDPOKLÁDÁ, že klient bude
posílat data v určité znakové sadě! Ta je dána systémovou proměnnou
character_set_client a je předkonfigurována při instalaci.
Pozn.: Což je pro neznalé hotové
neštěstí, neb až do verze 4.1 byla výchozí latin1 - něco, co našincům
moc vyhovovat nebude. Naštěstí se zdá, že většina instalací "pětek" má
přednastavenou utf8.
To, jakou znakovou sadu Váš server od klienta očekává si
můžete ověřit následujícím dotazem:
SHOW VARIABLES LIKE
'character_set_client';
To byly špatné zprávy, teď něco dobrých. Bez ohledu na to, jaká je
výchozí znaková sada si můžete poručit, že pro Vaše připojení budete
používat specifickou sadu. To provedete pomocí veledůležitého příkazu SET
NAMES. Jestliže tedy budu chtít ve zdraví provést příkaz INSERT
INTO, jak je uveden výše, mohu na to jít nějak takhle:
set names cp1250;
insert into cestina (win) values ('Příliš žluťoučký kůň pěl ďábelské
ódy');
set names latin2;
insert into cestina (latin) values ('Příliš žluťoučký kůň pěl ďábelské
ódy');
set names utf8;
insert into cestina (utf) values ('Příliš žluťoučký kůň pěl ďábelské
ódy');
Důležité:
Mají-li se data do databáze dostat ve správné znakové sadě, musí tedy
platit ZÁROVEŇ tato dvě pravidla:
- Sloupec, který má data pojmout musí být definován ve správné
znakové sadě
- Klient musí posílat příkazy na server ve znakové sadě, na níž se
dohodli (což je výchozí znaková sada nebo znaková sada určená pomocí
SET NAMES).
Pokud si příklady zkoušíte a zapsali jste cvičná data do tabulky,
můžete je teď zkusit pomocí řádkového klienta zobrazit:
a ejhle! Pokaždé se správně zobrazí jen ten sloupec, pro nějž je
odpovídajícím způsobem nastavena znaková sada. Čímž se vlastně
dostáváme k dalšímu tématu - a tím je spolupráce s PHP.
MySQL, znakové sady a PHP
Tady není moc co dodat. Je třeba si uvědomit, že z hlediska databáze
je PHP klient jako každý jiný, a že je tudíž namístě specifikovat v
našich ctěných skriptech rovněž odpovídající příkaz SET NAMES, nějak
takhle:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD
HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test znakových sad</title>
</head>
<body>
<?
mysql_connect("localhost","root");
mysql_select_db("test");
mysql_query("SET NAMES 'cp1250';"); //nebo 'latin2' nebo
'utf8'
$vysledek=mysql_query("select * from cestina;");
while ($zaznam=MySQL_Fetch_Array($vysledek)):
echo $zaznam["win"]."<BR>\n";
echo $zaznam["latin"]."<BR>\n";
echo $zaznam["utf"]."<BR>\n";
endwhile;
?>
</BODY>
</HTML>
Samozřejmě, že něco takového se musí udělat ještě předtím, než
databáze vrátí data, jinak je to zbytečné. Pokud si to chcete
vyzkoušet, zjistíte, že pokaždé jsou správně zobrazena jen data v
odpovídající znakové sadě, a že ostatní je "rozsypaný čaj".
A co importy?
Jestliže importujeme data do MySQL z textových souborů, je třeba
navíc dbát na to, aby i vstupní soubor s daty byl ve správné znakové
sadě. Jinak platí to, co jsme uvedli výše. Tedy:
- Importovaný soubor musí být ve správné znakové sadě (UTF-8,
například)
- Klient mysql musí obdržet příkaz SET NAMES XXX
- Data se musí ukládat do sloupce se správně nadefinovanou znakovou
sadou.
Není to složité, když si uvědomíte, jak spolu jednotlivé věci
souvisejí. Nepříjemné je, že musí být splněno více podmínek - a když
nejsou, nevyjde to.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|