Umíme to s Delphi: 97. díl – databáze Interbase a znakové sady

Znakové sady patří ve většině aplikací mezi důležité problémy. Dnešní článek je věnován vztahu znakových sad k databázové platformě Interbase: ukážeme si, jak při práci s touto databází zvolit znakovou sadu a všechny související atributy (především pořadí znaků používané při porovnávání dvou textových řetězců).
Jakýkoliv údaj (sloupec) typu CHAR, VARCHAR nebo (textový) BLOB může používat mnoho různých znakových sad. Znaková sada se používá k definici symbolů, které mohou být do údaje (do sloupce) vloženy a zároveň definuje nejvyšší počet bajtů, který je nutné vyhradit k uchování a reprezentování příslušného údaje. V některých znakových sadách (např. ISO8859_1) vyžaduje každý symbol pouze jeden bajt „úložného prostoru“. Jiné znakové sady mohou mít vyšší nároky (například znaková sada UNICODE_FSS uchovává jeden symbol na 1 až 3 bajtech).

Se znakovými sadami souvisí ještě jeden důležitý pojem, a tím je pořadí znaků v dané sadě. Mějme například následující slova: Cecilka, Chameleon, Citron, Česko, Duben. V jakém pořadí budou, necháme-li je seřadit podle abecedy?

Jednoznačná odpověď neexistuje. Pokud budeme řadit podle české abecedy, bude pořadí následující: Cecilka, Citron, Česko, Chameleon, Duben. Použijeme-li ovšem nějakou anglickou znakovou sadu (a s ní související anglická pravidla pro pořadí znaků), bude pořadí odlišné: Cecilka, Chameleon, Citron, Duben, Česko. Odlišné pořadí je dáno jednak interpretací písmene „CH“ v české abecedě a jednak pozicí písmene Č, které je v anglickém textu (v anglické znakové sadě) vyčleněno až kamsi daleko za alfabetické znaky.

Při práci s databázemi Interbase můžeme volit nejen použitou znakovou sadu, ale též požadované pořadí znaků (tzv. collation order). Volba znakové sady ještě neurčuje jednoznačně pořadí znaků (obvykle můžeme volit mezi několika různými pořadími), avšak částečně možný výběr zužuje.

Pracujeme-li s databází Interbase, můžeme volit, nastavovat a určovat mnoho bodů, které souvisí se znakovými sadami a s pořadím znaků, například:

  • přednastavenou znakovou sadu pro celou databázi (default character set),
  • alternativní znakovou sadu a pořadí znaků pro konkrétní sloupce v tabulce,
  • znakovou sadu používanou v klientské aplikaci: databázový server následně dokáže převádět symboly mezi znakovou sadou, kterou používá sám (a kterou používá databáze uložená na serveru) a mezi znakovou sadou, kterou používá klientská aplikace,
  • pořadí znaků (collation order), které má být respektováno při operacích porovnání,
  • pořadí znaků (collation order), které má být respektováno v klauzulích ORDER BY a GROUP BY v SQL dotazech.

V tomto článku bohužel nemáme prostor pro vyjmenování všech znakových sad a odpovídajících pořadí znaků, a zřejmě by to nebylo ani účelné. Případné zájemce tedy nezbývá než odkázat na dokumentaci k serveru Interbase.

Zmíníme a popíšeme však několik znakových sad, které by se nás mohly týkat v našich zeměpisných šířkách nebo které jsou nějak zajímavé.

V následující tabulce je pro každou znakovou sadu uveden minimální a maximální počet bajtů použitý k uložení jednoho (avšak každého) znaku. Uvádíme též seznam všech dostupných pořadí znaků (collation orders). První pořadí je vždy default – pokud tedy neuvedeme žádné, je použito první pořadí uvedené v tabulce.

Znaková sada ID znakové sady Minimální počet bajtů pro 1 znak Maximální počet bajtů pro 1 znak Collation orders (pořadí znaků)
ASCII 2 1 1 ASCII
DOS852 45 1 1 DOS852, DB_CSY, DB_PLK, DB_SLO, PDOX_CSY, PDOX_HUN, PDOX_PLK, PDOX_SLO
ISO8859_1 21 1 1 ISO8859_1, DA_DA, DE_DE, DU_NL, EN_UK, EN_US, ES_ES, FI_FI, FR_CA, FR_FR, IS_IS, IT_IT, NO_NO, PT_PT, SV_SV
NONE 0 1 1 NONE
UNICODE_FSS 3 1 3 UNICODE_FSS
WIN1250 51 1 1 WIN1250, PXW_CSY, PXW_HUNDC, PXW_PLK, PXW_SLO
WIN1251 52 1 1 WIN1251, PXW_CYRL
WIN1252 53 1 1 WIN1252, PXW_INTL, PXW_INTL850, PXW_NORDAN4, PXW_SPAN, PXW_SVEDFIN

Předchozí tabulka obsahuje výběr několika zajímavých znakových sad a jejich odpovídajících pořadí znaků (collation orders). V několika následujících kapitolách si ukážeme praktickou realizaci nejzákladnějších činností týkajících se znakových sad v databázích Interbase.

Určení implicitní (default) znakové sady pro databázi

Jak nám logika věci velí, určení implicitní znakové sady je nutné provést při vytváření databáze. Rozdělíme tedy problém na tři skupiny podle způsobu, jakým se k vytvoření databáze postavíme.

Použijeme-li k vytváření databáze nějaký grafický nástroj, například IBConsole, zadáme požadovanou znakovou sadu interaktivně v příslušném dialogovém okně. Tento bod není třeba nijak zvláště rozepisovat, v jednom z předchozích dílů najdete příklad na vytvoření nové databáze (včetně nastavení znakové sady) pomocí IBConsole.

Rozhodneme-li se vytvořit databázi v Delphi pomocí metody IBDatabase.CreateDatabase, je nutné správně nastavit vlastnost Params této komponenty. A právě do vlastnosti Params musíme zadat potřebné parametry pro vytváření databáze. Součástí těchto parametrů (tedy součástí obsahu vlastnosti Params) bude i nastavení znakové sady, například:

USER "SYSDBA"
PASSWORD "masterkey"
PAGE_SIZE 4096
CHARACTER SET WIN1250

Vytváříme-li databázi prostřednictvím SQL skriptu, je nutné zahrnout požadovanou znakovou sadu přímo do příslušného SQL příkazu, tedy do příkazu CREATE DATABASE. Na tomto místě bych rád zdůraznil, že CREATE DATABASE je odlišný příkaz od známého CREATE TABLE. CREATE TABLE vytváří jednu databázovou tabulku (např. Zaměstnanec) a voláme jej tedy tolikrát, kolik tabulek v databázi potřebujeme. Naproti tomu CREATE DATABASE voláme jen jednou, na začátku práce, a s jeho pomocí vytvoříme databázi (avšak ještě žádné datové tabulky). Znakovou sadu zadáváme pro celou databázi (nikoliv pro jednu tabulku), proto nás v tomto případě bude zajímat právě příkaz CREATE DATABASE.

A jakým způsobem v příkazu CREATE DATABASE zvolit znakovou sadu? Používá se klíčových slov DEFAULT CHARACTER SET, za něž se uvede název požadované znakové sady:

CREATE DATABASE ’nasedb.gdb’ DEFAULT CHARACTER SET WIN1250;

Tímto příkazem jsme jednak vytvořili databázi NASEDB a jednak stanovili její implicitní znakovou sadu na WIN1250. Pokud nyní budeme do databáze ukládat jakákoliv textová (a nestanovíme-li jinak), bude databázový server předpokládat tuto znakovou sadu a podle toho se bude při ukládání chovat.

Určení implicitní znakové sady při vytváření databáze patří k doporučeným krokům, na které bychom neměli zapomínat. Pokud neurčíme žádnou znakovou sadu, implicitně bude používána znaková sada NONE. Tato zvláštní datová sada naštěstí neznamená, že nejdou ukládat žádné znaky, ale na druhou stranu od ní nelze čekat žádné velké zázraky: data budou prostě ukládána přesně tak, jak na server přijdou, bez jakýchkoliv úprav.

Určení znakové sady pro konkrétní sloupec v databázi

Než se pro dnešek rozloučíme, ukážeme si další činnost související se znakovými sadami. Sice už víme, jakým způsobem nastavit implicitní znakovou sadu pro celou databázi, ale to neznamená, že není možné specifikovat (alternativní) znakovou sadu pro jeden nebo více konkrétních sloupců.

Opět si ukážeme, jak pomocí SQL příkazů stanovit znakovou sadu pro daný sloupec. Příslušná SQL klíčová slova budou součástí definice datového typu typu CHAR nebo VARCHAR. Pokud definujeme znakovou sadu na úrovni sloupce, má tato volba vyšší prioritu než implicitní znaková sada zadaná při vytváření databáze (překryje ji). K určení znakové sady se používá klíčových slov CHARACTER SET.

Následující SQL kód vytváří tabulku, která obsahuje dva sloupce. Protože v této tabulce hodláme uchovávat ruská jména, je nutné specifikovat alternativní znakovou sadu:

CREATE TABLE RUS_JMENA(
  JMENO VARCHAR(30) CHARACTER SET CYRL,
  PRIJMENI VARCHAR(40) CHARACTER SET CYRL,
);

Určení pořadí znaků při vytváření/změně sloupce Po popisu znakových sad se dostáváme k základním informacím o pořadí znaků (collation order). Jakmile vytváříme sloupec typu CHAR nebo VARCHAR pomocí CREATE TABLE (případně pokud jej měníme pomocí ALTER TABLE), můžeme specifikovat toto pořadí použitím klíčového slova COLLATE. Použití tohoto klíčového slova je nejvhodnější u znakových sad jako např. ISO8859_1 nebo DOS437, které podporují mnoho různých (možných) pořadí.

Ukažme si opět příklad. Napíšeme příkaz pro přidání nového sloupce do (existující) tabulky. Specifikujeme znakovou sadu i pořadí znaků pro tento sloupec:

ALTER TABLE ’ZAMESTNANEC’
  ADD ADDRESA VARCHAR(40) CHARACTER SET ISO8859_8 COLLATE DB_CSY;

Určení pořadí znaků pro porovnávání

Porovnávání provádíme typicky pomocí klíčového slova WHERE uvnitř příkazu SELECT. V tomto případě může být někdy vhodné mít možnost zvolit pořadí znaků, které chceme při porovnávání vzít v potaz. Tato potřeba nastává zejména v těch situacích, kdy porovnávané hodnoty používají různé znakové pořadí.

Ke specifikaci pořadí, které chceme respektovat v průběhu porovnávání, vložíme klauzuli COLLATE dovnitř porovnávacího SQL příkazu. Ukážeme si příklad, v němž porovnáváme hodnotu z databáze z hodnotou převzatou z aplikace (ve formě parametru). Hodnotu na levé straně přiřazovacího příkazu „přinutíme“ porovnávat se za použití specifikovaného pořadí:

  ...WHERE LNAME COLLATE FR_CA = :lname_search;

Určení pořadí znaků v klauzulích ORDER BY A GROUP BY

Také pokud chceme explicitně určit pořadí znaků pro potřeby klauzulí ORDER BY A GROUP BY (typicky pokud porovnávané údaje používají rozdílná pořadí), řešení nás nepřekvapí. Stačí opět vložit do příslušného SQL příkazu klauzuli COLLATE:

  ...ORDER BY LNAME COLLATE FR_CA, FNAME COLLATE FR_CA;

Tolik základní informace ohledně znakových sad a pořadí znaků.

Na závěr

Dnešní článek se zabýval znakovými sadami a jejich vztahem k databázové platformě Interbase. Ukázali jsme si, jak určit použitou (požadovanou) znakovou sadu při vytváření databáze, při úpravách a editacích a při další práci. Volba vhodné znakové sady je klíčové pro správnou funkčnost kterékoliv aplikace a nemá asi smysl příliš zdůrazňovat, že zejména čeština má se znakovými sadami neustálé a neutuchající potíže. Věřím, že k jejich řešení vám napomůže i dnešní článek.

Diskuze (6) Další článek: Útoku červa Blaster se Microsoft elegantně vyhnul

Témata článku: Software, Programování, Unicode, Sloupec, Order, Sta, Znak, Různé typy, Díl, Alter, Chameleon, Databáze, Nutná úprava, Stem, Doporučené pořadí, Klíčový parametr, Seti, Klíčová vlastnost, Různé znaky, Minimální úprava

Určitě si přečtěte


Aktuální číslo časopisu Computer

Zachraňte nefunkční Windows

Jak nakupovat a prodávat kryptoměny

Otestovali jsme konvertibilní notebooky

Velký test 14 herních myší