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.

Úvod

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.

Pozn.: Databázový program Access z Microsoft Office používá J-SQL.

Obecné typy

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).

Bajt

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.]

Celé číslo

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.]

Dlouhé celé číslo

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.]

Desetinné číslo v jednoduché přesnosti

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.]

Desetinné číslo ve dvojnásobné přesnosti

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.]

Text

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.]

Memo

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.]

Date

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.

Logical

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.]

Další typy prostředí Windows

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.

Objekt OLE

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.]

Binární

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á.]

Automatické číslo

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á.]

Měna

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.]

Identifikační číslo

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á.]

 

Přehled

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.

 

 

Literatura a další výukové zdroje

[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