Datové typy při provozu databází v prostředí Microsoft
Doc. Dr. Vladimír Homola, Ph.D.
Poznámka: Tento článek byl jedním ze zdrojů pro publikaci [1] stejného autora.
Zcela zásadní je v konkrétním databázovém systému přesné určení množiny množin, které poskytují své prvky (= hodnoty) do n-tic (=záznamů) libovolné relace (=tabulky), kterou lze v systému vytvořit a udržovat.
Firma Microsoft se významně podílela na budování databázových prostředí jak obecně, tak konkrétních implementací. Ve své řadě systémů známých jako nejrůznější "Wokna", provozovaných nejčastěji na strojích řady PC bázovaných procesorem (a matematickým koprocesorem) Intel, staví na hardwarových typech s pochopitelných důvodů: instrukce procesoru zpracovávající hardwarové typy dat jsou evidentně nejrychlejším a nejoptimálnějším nástrojem pro použití v databázových programech.
Na druhé straně se stejná firma musela zabývat přístupem k datům jiných systémů. Jejich autoři však stáli před stejným problémem, a to naštěstí vedlo k jisté unifikaci v realizacích datových modelů a tedy i datových typů.
Obecným nástrojem pro správu databází a čerpání informací se postupem času stal dotazovací jazyk SQL (Structured Query Language) - podrobněji viz také příslušná kapitola v [1]. Pomocí příkazů jazyka lze tabulky databází vytvořit a upravit. Příkazy tedy musí mít možnost označit typ dat konkrétního sloupce případně jeho další atributy. Tak např. příkaz
create table VYDAJE (DATUM date, CENA numeric, NAKOUPENO text(30))
vytváří tabulku VYDAJE se třemi sloupci (DATUM, CENA, NAKOUPENO), přičemž ve sloupci DATUM se budou uchovávat datumové, ve sloupci CENA číselné a ve sloupci NAKOUPENO textové údaje. Typy dat jsou označeny klíčovými slovy date, numeric, text.
V jednom (operačním) systému se běžně může uchovávat několik databází (=zdrojů dat) různých formátů. Je to dáno historicky (např. dBase - formát .DBF), požadavky na maximální zabezpečení (servery na úrovni operačního systému) apod. Příkazy jsou vydávány jádru konkrétního databázového systému, který je interpretuje, pomocí driverů - řadičů příslušných ovladačů dat (viz obrázek vlevo níže). Na obrázku vpravo je pak znázorněn případ, kdy je možno požadovat data i od běžících serverů, ne nutně téhož (operačního) systému.
Pro obecné použití jazyka a pro přenositelnost je žádoucí,
aby pokud možno všichni poskytovatelé dat přijímali tentýž tvar příkazů včetně
klíčových slov. Při použití klíčových slov ve významu typů hodnot je naopak
nežádoucí, aby stejná klíčová slova označovala jinou přijímanou množinu hodnot
nebo jiná omezení na ni kladenou.
Přístup k datům v systémech s databázovým jádrem |
Přístup k datům v systémech i se servery SQL - příklad pro MySQL |
V současné době - z pohledu uživatelů systémů Microsoftu - lze pozorovat několik jemně se odlišujících verzí jazyka SQL.
Především je to ta verze, která by měla být závazná pro všechny interprety - verze popsaná americkou ANSI normou a označovaná jako ANSI SQL. Dále bude označována jako A-SQL.
Dále je to verze, kterou Microsoft používá pro své vlastní specielní databáze, obhospodařované "databázovým tryskovým strojem" - Database Jet Engine, a kterou nazývá Jet SQL (v některých odkazech také jako Microsoft Access Jet SQL). Dále bude označována jako J-SQL.
Konečně je to verze, kterou - opět Microsoft - používá pro zpracování dat v rámci svého SQL serveru a kterou nazývá MS Server SQL. Dále bude označována jako S-SQL.
Z jiných serverů než Microsoftu uveďme server MySQL hojně v Česku používaný, protože jeho základní verze je zadarmo. Verze jeho SQL bude označována jako M-SQL.
Pozn.: Databázový program Access z Microsoft Office používá J-SQL.
Do databází různých systémů lze čerpat hodnoty z následujících - většinou instrukcemi (ko)procesoru zpracovatelných - množin [v hranatých závorkách jsou tučně uvedena klíčová slova typu použitelná v dané verzi SQL; je-li jich více, jsou to synonyma]. V různých verzích SQL existuje pro jeden datový typ často více synonym. V níže uvedeném přehledu jsou uvedena ta klíčová slova, která jsou pokud možno společná co nejvíce verzím SQL.
Pozn.: Verze M-SQL má hodnoty některých typů mírně odlišné od ostatních (např. minimální datum je 1.1.1000 místo jinak uváděného 1.1.100).
Množina 256 hodnot celých čísel z intervalu <0,255>. Každá hodnota obsazuje 1 byte. [A-SQL: nemá. J-SQL: byte. S-SQL: tinyint. M-SQL: tinyint unsigned - dvě klíčová slova.]
Množina 65 536 hodnot celých čísel z intervalu <-32 768, +32 767>. Každá hodnota obsazuje 2 byty. [A-SQL: smallint. J-SQL: smallint, short. S-SQL: smallint. M-SQL: smallint.]
Množina 4 294 967 296 hodnot celých čísel z intervalu <-2 147 483 648, +2 147 483 647>. Každá hodnota obsazuje 4 byty. [A-SQL: integer. J-SQL: integer, long. S-SQL: integer. M-SQL: integer, int.]
Množina 4 294 967 296 hodnot racionálních čísel z intervalu <-3.402823 x 1038, +3.402823 x 1038>. Každá hodnota obsazuje 4 byty. Nejmenší kladné číslo různé od nuly je 1.401298 x 10-45. [A-SQL: real. J-SQL: real, single. S-SQL: real. M-SQL: float.]
Množina zhruba 1.845 x 1019 hodnot racionálních čísel z intervalu <-1.79769313486231 x 10308, +1.79769313486232 x 10308>. Každá hodnota obsazuje 8 bytů. Nejmenší kladné číslo různé od nuly je 4.94065645841247 x 10-324. [A-SQL: float. J-SQL: float, double. S-SQL: float. M-SQL: double, real.]
Množina zhruba 10618 textových řetězců, z nichž každý obsahuje žádný, jeden až 256 znaků. Jeden znak je přitom uložen pod svým jednobytových kódem dle zvolené kódové tabulky znaků. [A-SQL: nemá. J-SQL: text. S-SQL: text. M-SQL: tinytext.]
Množina zhruba 10157 713 textových řetězců, z nichž každý obsahuje žádný, jeden až 65 534 znaků. Jeden znak je přitom uložen pod svým jednobytových kódem dle zvolené kódové tabulky znaků. Na rozdíl od předchozího typu Text může Memo obsahovat i znaky pro odřádkování. [A-SQL: nemá. J-SQL: memo. S-SQL: nemá. M-SQL: text.]
V databázích Microsoftu jde o množinu 3 615 900 kalendářních datumů počínaje 1.1. roku 100 a konče 31.12. roku 9999. Každé takové datum je pak representováno hodnotou Double (viz výše) - tedy racionálním číslem, přičemž celá část takového čísla je pořadové číslo dne počínaje 30.12.1899 (to je den s pořadovým číslem 0). 1.1.100 je den s pořadovým číslem -657 434 a 31.12.9999 je den s pořadovým číslem 2 958 465. Desetinná část racionálního čísla vyjadřuje zlomek dne, tedy čas v daném dni (např. 0.75 nějakého dne je 6 hodin večer). Každé jedno kalendářní datum kolem roku 2000 má zhruba 1.374 x 1011 různých časových údajů - jinak řečeno, existuje zhruba 1.374 x 1011 různých racionálních čísel majících stejnou celou část a lišících se částí desetinnou. Tím je dána i přesnost zaznamenání časového údaje - kolem roku 2000 to je zhruba 1.26 x 10-6 vteřiny. [A-SQL: date. J-SQL: date, datetime. S-SQL: datetime. M-SQL: date.]
Raritou je ve firmě Microsoft tento fakt: počátek datumů v programu Access této firmy je skutečně 30.12.1899. Ovšem počátkem datumů v programu Excel téže firmu je 31.12.1899 (tj. o jeden den víc), přičemž konverze dat mezi oběma programy probíhá v pořádku - prostě odečtou nebo přičtou jedničku. Proč si raději nedali tu práci se sjednocením, to snad neví ani kolega Gates - údajně pro problémy s přestupným rokem právě na počátku počítání dnů kolem dne 0. Na druhé straně si databáze Microsoftu na rozdíl od Excelu bez problémů poradí i se zobrazením datumu před rokem 1900.
Množina dvou hodnot obvykle označovaných {Ano, Ne}, {True, False}, {0, 1}, {Yes, No} apod. Teoreticky stačí pro uchování jedné hodnoty této množiny jeden bit, z praktických důvodů se často používá jeden byte s tím, že nulový byte reprezentuje hodnotu Ne, všechny ostatní hodnoty Ano. [A-SQL: nemá. J-SQL: bit, logical, yesno. S-SQL: bit. M-SQL: bit.]
Do databází lze čerpat hodnoty i z dalších množin. Ty však už mohou být systémově závislé: zatímco hodnota některé množiny je v jednom (zde operačním) systému podporována, ve druhém ne - nebo je podporována jinak. Níže jsou uvedeny ty množiny, které podporují systémy řady Windows firmy Microsoft.
Množina objektů OLE (Object Linking and Embedding), každý o velikosti žádný, jeden až zhruba 2 mld. bytů. Pod pojmem OLE se rozumí unifikované prostředí poskytující objektově orientované služby. OLE objekt je tedy objekt využívající služeb tohoto prostředí. Je zřejmé, že služby jsou vázané na konkrétní operační systém a databáze s OLE objekty nejsou obecně mezi systémy přenositelné. [A-SQL: nemá. J-SQL: image, longbinary, oleobject. S-SQL: image.]
Množina zhruba 101230 (binárních) hodnot na žádném, jednom až 510 bytech. [A-SQL: bit. J-SQL: binary. S-SQL: binary. M-SQL: nemá.]
Množina 2 147 483 647 celých čísel počínaje 1. Z této množiny databázový systém přiděluje hodnoty do databáze jednak automaticky, jednak jedinečně. [A-SQL: nemá. J-SQL: counter. S-SQL: nemá. M-SQL: nemá.]
Množina zhruba 1018 hodnot z intervalu <-922 337 203 685 477.5808, +922 337 203 685 477.5807>. Jde tedy o desetinná čísla vždy se čtyřmi desetinnými místy. [A-SQL: nemá. J-SQL: money, currency. S-SQL: money. M-SQL: do jisté míry lze použít bigint.]
Množina zhruba 3.4 x 1038 celých kladných čísel s binárním vyjádřením na 16 bytech. Jedná se o jedinečný identifikátor každého objektu, který se registruje do prostředí Windows firmy Microsoft, známé GUID (Globally Unique IDentifier). Je generován algoritmem zaručujícím jeho jedinečnost. [A-SQL: nemá. J-SQL: guid. S-SQL: nemá. M-SQL: nemá.]
Obsah této kapitoly je pro výukové účely převzat z [2] (viz), jimž náleží autorská práva. Obsah tabulky s českými poznámkami je velmi mírně upraveným výstupem překladače [3]. Pro jistotu je však ponechán i originální text v tabulce s anglickými poznámkami.
J-SQL (Access Jet) | S-SQL (MS Server) | A-SQL (ANSI) | Synonyma |
BINARY (viz Poznámky) | BINARY, VARBINARY | BIT, BIT VARYING | VARBINARY, BIT VARYING |
BIT (viz Poznámky) | BIT | Nepodporováno | BOOLEAN, LOGICAL, YESNO |
TINYINT | TINYINT | Nepodporováno | INTEGER1, BYTE |
COUNTER (viz Poznámky) | (viz Poznámky) | Nepodporováno | AUTOINCREMENT |
MONEY | MONEY | Nepodporováno | CURRENCY |
DATETIME | DATETIME | DATE, TIME, TIMESTAMP | DATE, TIME (viz Poznámky) |
UNIQUEIDENTIFIER | UNIQUEIDENTIFIER | Nepodporováno | GUID |
DECIMAL | DECIMAL | DECIMAL | NUMERIC, DEC |
REAL | REAL | REAL | SINGLE, FLOAT4 |
FLOAT | FLOAT | DOUBLE PRECISION, FLOAT | DOUBLE, FLOAT8, NUMBER (viz Poznámky) |
SMALLINT | SMALLINT | SMALLINT | SHORT, INTEGER2 |
INTEGER | INTEGER | INTEGER | LONG, INTEGER4 |
Nepodporováno | Nepodporováno | INTERVAL | Nepodporováno |
IMAGE | IMAGE | Nepodporováno | LONGBINARY, GENERAL, OLEOBJECT |
TEXT (viz Poznámky) | TEXT | Nepodporováno | LONGTEXT, LONGCHAR, MEMO (viz Poznámky) |
CHAR (viz Poznámky) | CHAR, VARCHAR | CHAR, CHARACTER | TEXT(n), CHARACTER, STRING, VARCHAR (viz Poznámky) |
Poznámky | |
1. | Datovému typu BIT v ANSI SQL neodpovídá v Access SQL datový typ BIT, ale datový typ BINARY. Pro datový typ BIT v Access SQL neexistuje v ANSI SQL žádný ekvivalent. |
2. | TIMESTAMP již není podporován jako synonymum pro DATETIME. |
3. | Identifikátor NUMERIC již není podporována jako synonymum pro FLOAT nebo DOUBLE. Identifikátor NUMERIC se nyní používá jako synonymum pro DECIMAL. |
4. | Pole LONGTEXT je vždy uloženo ve formátu reprezentace Unicode. |
5. | Pokud je použit název datového typu TEXT bez zadání volitelné délky (tzn. nikoliv například TEXT(25), ale jen TEXT), vytvoří se pole LONGTEXT. To umožňuje zapsat příkazy CREATE TABLE, které vytváří datové typy konzistentní s Microsoft SQL Server. |
6. | Pole CHAR je vždy uloženo ve formátu reprezentace Unicode, což je ekvivalent datového typu CHAR v ANSI SQL. |
7. | Pokud je použit název datového typu TEXT a je zadána volitelná délka (například TEXT(25)), pak je datový typ tohoto pole ekvivalentní datovému typu CHAR. Tím je zachována zpětná kompatibilita pro většina aplikací Microsoft Jet, přičemž je datový typ TEXT (bez specifikace délky) v souladu se serverem Microsoft SQL Server. |
Notes | |
1. | The ANSI SQL BIT data type does not correspond to the Microsoft Access SQL BIT data type. It corresponds to the BINARY data type instead. There is no ANSI SQL equivalent for the Microsoft Access SQL BIT data type. |
2. | TIMESTAMP is no longer supported as a synonym for DATETIME. |
3. | NUMERIC is no longer supported as a synonym for FLOAT or DOUBLE. NUMERIC is now used as a synonym for DECIMAL. |
4. | A LONGTEXT field is always stored in the Unicode representation format. |
5. | If the data type name TEXT is used without specifying the optional length, for example TEXT(25), a LONGTEXT field is created. This enables CREATE TABLE statements to be written that will yield data types consistent with Microsoft SQL Server. |
6. | A CHAR field is always stored in the Unicode representation format, which is the equivalent of the ANSI SQL NATIONAL CHAR data type. |
7. | If the data type name TEXT is used and the optional length is specified, for example TEXT(25), the data type of the field is equivalent to the CHAR data type. This preserves backwards compatibility for most Microsoft Jet applications, while enabling the TEXT data type (without a length specification) to be aligned with Microsoft SQL Server. |
[1] DROZDOVÁ, J., HOMOLA, V.: Databáze pro geovědní obory. VŠB-TU Ostrava 2019. ISBN 978-80-248-4265-3.
[2] MICROSOFT: Equivalent ANSI SQL data types. [online]. Microsoft, 2023. [cit. 20. 2. 2023]. Dostupné z https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/equivalent-ansi-sql-data-types
[3] GOOGLE: Google Překladač [online]. Google, Dublin, Ireland, 2023. [cit. 20. 2. 2023]. Dostupné z https://translate.google.com
Orig: 2 / 2004
Rev: 2 / 2023