LINUXSOFT.cz
Nazwa użytkownika: Hasło:     
    CZ UK PL

> MySQL (6) - Ukládáme řetězce

Jak správně využít datové typy - dnes o řetězcích.

18.3.2005 15:00 | Petr Zajíc | czytane 55491×

RELATED ARTICLES KOMENTARZE   

Pojďme se v několika dalších dílech seriálu podrobně podívat na datové typy, které má databáze MySQL pro uložení dat k dispozici. Jejich zvládnutí, jak ještě uvidíme, je totiž základním pilířem úspěšné práce s databází a vede rovněž k tomu, že je práce daty prováděna tím nejrychleším možným způsobem.

Srovnání s programovacími jazyky

Nejprve jedno malé varování. Jestliže zvolíte nesprávný datový dyp pro uložení proměnné v klasických programovacích jazycích (např. v C apod.), je to samozřejmě nesprávně. Například zbytečně velký datový typ spotřebuje o něco více paměti a program může běžet výrazně pomaleji. V databázích je to však MNOHEM HORŠÍ.

Nesprávný datový typ může způsobit to, že databáze o dost naroste a že se zpomalí. Jak již jsme totiž v seriálu uvedli, musí být pro jeden sloupec pevně stanoven datový typ a ten budou používat všechny řádky. Drsnost, s jakou se vám vrátí špatný návrh datových typů pro jednotlivé sloupce bude tedy přímo úměrná počtu řádků v té které tabulce. Když k tomu přičtete fakt, že tabulka se obvykle navrhuje jen jednou a pak se již "jen" plní daty, je při nepozorně zvoleném datovém typu zaděláno na pořádné problémy.

Abych ale jen nestrašil: V MySQL, stejně jako v mnoha jiných databázových systémech je možné změnit typ sloupce, a to obvykle bez ztráty dat (například změna z celého čísla na řetězec a podobně). Někdy to ovšem možné není a někdy konverzi existujících dat provází změna jejich přesnosti nebo jiné problémy, není proto nic lepšího, než si vše řádně promyslet předem.

Rozdělení datových typů MySQL

Stejně, jako je tomu v každém DBMS, jsou i v MySQL určité "základní" datové typy. Tím mám na mysli ty, které se vám vyplatí znát z hlavy, protože se budou objevovat téměř v každé tabulce. Úplně to nejjednodušší rozdělení je, že v databázi MySQL můžete skladovat:

  • řetězce
  • čísla
  • datumy
  • prázdné hodnoty (tedy nic)

Obecně mohou mít řetězce pevnou či proměnnou délku, a mívají specifikovánu znakovou sadu. Čísla mohou být se znaménkem nebo bez znaménka, celá či desetinná, přesná nebo nepřesná. Datumy pak mohou obsahovat údaj o datu, čase nebo oba údaje. A prázdná hodnota je natolik zajímavým databázovým jevem, že se k ní ještě podrobně vrátíme. Pojďme se teď podívat na jednotlivé datové typy trochu podrobněji - dnes na řetězce.

Řetězce

Chcete-li uložit do databáze krátké řetězce (například jména a příjmení), použijte datový typ CHAR nebo VARCHAR. Pokud chcete tyto typy použít, musíte vědět, jak dlouhé mohou znaky maximálně být. Rozdíl mezi CHAR a VARCHAR je především v tom, že se jinak ukládají:

  • Datový typ CHAR se ukládá vždy jako řetězec s daným počtem znaků. Je-li definován například jako CHAR (30) a zadáte-li do něj hodnotu HONZA, bude v databázi uloženo HONZA a k tomu pětadvacet mezer. Když se z databáze údaj načítá, jsou mezery na konci řetězce odřízuty a údaj je vrácen bez nich
  • Datový typ VARCHAR se ukládá jako řetězec s proměnlivým počtem znaků. Neboli, je vždy uložen jak řetězec, tak počet znaků, které zabírá. V předchozím případě by například byl uložen řetězec HONZA a údaj o tom, že je 5 znaků dlouhý. Když se údaj z databáze načítá, jsou mezery na konci řetězce odřízuty a údaj je vrácen bez nich stejně, jako je tomu při použití typu CHAR.

Možná se ptáte, jaký má smysl ukládat u typu CHAR do databáze zbytečné mezery. Databáze tím přece nabyde na objemu, ne? To je pravda; na druhou stranu je však získávání dat s pevnou délkou mnohem rychlejší než získávání dat s délkou proměnlivou. Obecná rada tedy je: Mají-li data pevnou nebo víceméně pevnou šířku, ukládejte je jako CHAR, jestliže se šířka dost mění, používejte VARCHAR.

Výchozí chování MySQL je takové, že při ukládání a vracení řetězců nemění velikost písmen. To je ostatně to, co bychom asi čekali. Jinak je k manipulaci s řetězci v MySQL k dispozici celá řada funkcí; budeme se jimi zabývat později.

Z toho, co bylo řečeno výše vyplývá jedna dosti podstatná nepříjemnost. Jelikož oba uvedené datové typy odřezávají koncové mezery, neexistovala donedávna žádná možnost, jak uložit a spolehlivě vrátit pomocí typů CHAR nebo VARCHAR řetězce, mající na konci mezery. Jediná možnost byla použít typ BLOB, o němž bude v seriálu řeč zanedlouho. Toto chování, kdy se nevracejí uživatelem zadané mezery na konci řetězců navíc odporuje normě. Ve verzi MySQL 5.0.3 je tato nepříjemnost odstraněna a typy CHAR a VARCHAR jdou nastavit tak, aby vracely i mezery na konci (samozřejmě jen tehdy, pokud byly součástí zadávaných dat).

Další důležitá informace: Když se do polí typu CHAR nebo VARCHAR pokusíte uložit delší data, než jaká je sloupec schopen pojmout, příkaz NESELŽE. V závislosti na tom, co se stalo může nastat jedna z následujících tří věcí:

  1. Data se oříznou a příkaz se tváří, jako by se nic nestalo. To nastane v případě, kdy oříznutými znaky jsou pouze mezery.
  2. Data se oříznou a příkaz vrátí varování (warning). To nastane v případě, kdy oříznutím "utrpí" i jiné znaky kromě mezer.
  3. Data se oříznou a příkaz vrátí chybu (error). To nastane v případě, kdy oříznutím utrpí i jiné znaky kromě mezer a server je nastaven, aby místo varování skončil příkaz chybou

V souvislosti s řetězci je často slyšet výrazy "character set" (znaková sada) a "collation" (porovnávání). Znaková sada je přesně to, co například v HTLM stránce - tedy kódování textu. MySQL podporuje všechny běžné české znakové sady (utf-8, latin2 neboli ISO-8859-2 a cp1250, středoevropské windows) a to jak na úrovni serveru, tak na úrovni sloupce. Neboli, znakovou sadu můžete definovat jako součást sloupce typů CHAR a VARCHAR; když to neuděláte, použije se výchozí znaková sada serveru. Zobrazit použitelné znakové sady můžete zadávním MySQL příkazu

show character set;

Collation (neboli třídění) je jiná věc. Dalo by se zjednodušeně říci, že každá znaková sada může mít jedno a více třídění. Seznam dostupných třídění dané instance serveru lze zobrazit pomocí příkazu

show collation;

Pokud chceme, můžeme ke znakové sadě sloupce datového typu přiřadit některé z existujících způsobů řazení; pokud to neuděláme, použije se to řazení, které je pro danou znakovou sadu nastaveno jako výchozí. Předpokládám, že již asi tušíte, k čemu povedou následující příkazy:

show collation like 'utf8%';
show collation like 'latin2%';
show collation like 'cp1250%';

Práce se znakovými sadami a řazeními je tak důležitá, že ji později v seriálu věnujeme více prostoru. Příště se však zaměříme na práci s nejrůznějšími datovými typy, do nichž se v MySQL dají uložit čísla.


KOMENTARZE
TEXT 2.5.2006 21:51 Joe
  L Re: TEXT 1.2.2012 14:57 M Podbi
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
> Szukanie oprogramowania
1. Pacman linux
Download: 4850x
2. FreeBSD
Download: 9044x
3. PCLinuxOS-2010
Download: 8541x
4. alcolix
Download: 10915x
5. Onebase Linux
Download: 9631x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 6219x

1. xinetd
Download: 2382x
2. RDGS
Download: 937x
3. spkg
Download: 4692x
4. LinPacker
Download: 9918x
5. VFU File Manager
Download: 3173x
6. LeftHand Mała Księgowość
Download: 7171x
7. MISU pyFotoResize
Download: 2775x
8. Lefthand CRM
Download: 3540x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 3087x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz