Taky v databázích používáte těch "svých" několik datových typů a máte spíš jenom matnou představu, co představuje přehršel dalších možností v rolovátku, kterým se určuje typ daného sloupce? Microsoft SQL Server 2008 nabízí přes třicet datových typů, z nichž některé jsou použitelné pouze v Transact-SQL, další však můžeme přiřazovat datovým polím. Podívejme se, co která volba vlastně znamená.
Microsoft klasifikuje typy do těchto kategorií:
- přesná čísla (Exact Numerics)
- přibližná čísla (Approximate Numerics)
- datum a čas (Date and Time)
- řetězce znaků (Character Strings)
- řetězce znaků Unicode (Unicode Character Strings)
- binární řetězce (Binary Strings)
- prostorová data (Spatial Types)
- ostatní datové typy
Ukládáme čísla
Základním typem pro celá čísla je pochopitelně int. Pokud nám z nějakého důvodu nestačí, můžeme použít bigint. Naopak není-li třeba ukládat tak velké hodnoty, jsou k dispozici smallint a tinyint.
Specialitou je bit pro ukládání hodnot pravda/nepravda. SQL Server navíc tabulku optimalizuje tak, že více polí tohoto typu ukládá do bajtů (tedy po osmi najednou).
Decimal(p, s) a numeric (p, s) jsou funkčně totožné a slouží k uložení desetinných čísel se specifikovanou přesností (p, precision) a měřítkem (s, scale). Precision udává nejvyšší počet číslic, které budou uloženy, a to jak vpravo, tak vlevo od desetinné čárky. Výchozí hodnota je 18, minimum 1 a maximum 38. Scale je nejvyšší možný počet číslic vpravo od desetinné čárky. Výchozí hodnotou je 0, minimální taky 0, maximální p. Na volbě parametrů závisí výsledná velikost dat. Použití těchto typů má smysl pro data pocházející z výpočtů.
Zvláštní variantou typu decimal jsou money a smallmoney, určené pro ukládání hodnot měny. Odpovídají v podstatě decimal s nastavenou přesností na čtyři desetinná místa.
S plovoucí desetinnou čárkou operují typy float a real. Syntaxe pro float by měla zahrnovat i parametr n, kterým se nastaví mantisa čísla, nicméně v návrháři tabulek Visual Studia pro SQL Server 2008 Express tato možnost chybí. Mělo by ovšem platit, že real odpovídá float(24). Výchozí (a zároveň nejvyšší možná) hodnota n je 53.
Název | Rozsah | Velikost |
int | -2 147 483 648 až 2 147 483 647 (-231 až 231-1) | 4 B |
bigint | -9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 (-263 až 263-1) | 8 B |
smallint | -32 768 až 32 767 (-215 až 215-1) | 2 B |
tinyint | 0 až 255 | 1 B |
bit | 0, 1 nebo null | viz popis nahoře |
decimal/numeric | -1038+1 až 1038-1 při nejvyšší přesnosti (38) | závisí na přesnosti: při p = 1-9 je velikost 5 B při p = 29-38 je velikost 17 B |
money | -922 337 203 685 477,5808 až 922 337 203 685 477,5807 | 8 B |
smallmoney | -214 748,3648 až 214 748,3647 | 4 B |
float | -1,79E+308 až -2,23E-308, 0 a 2,23E-308 až 1,79E+308 | závisí na n (pro n = 53 je to 8 B) |
real | -3,40E+38 až -1,18E-38, 0 a 1,18E-38 až 3,40E+38 | 4 B |
Ukládáme datum a čas
SQL Server 2008 doplnil klasický datetime o čtyři nové typy: date, time, datetime2 a datetimeoffset. Díky tomu je možné definovat sloupce přesně odpovídající potřebám dat. Nové typy rozšiřují rozsahy, některé dovolují stanovit přesnost (při deklaraci) a jiné přinášejí práci s časovými zónami.
Time se ukládá v 24h formátu a představuje místní čas (nemá představu o časové zóně). Přesnost ovlivní, kolik místa zabere.
Naproti tomu datetimeoffset vyžaduje zadání časové zóny (posunu), dokáže tedy pracovat s mezinárodním časem. Syntaxe zadávání dat odpovídá jednomu ze dvou formátů ISO 8601:
- YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]
- YYYY-MM-DDThh:mm:ss[.nnnnnnn]Z (pro UTC)
Datový typ timestamp se nepojí s reálným časem a je popsán v části o ostatních typech.
Název | Rozsah | Velikost |
date | 0001-01-01 až 9999-12-31 (YYYY-MM-DD) |
3 B |
datetime | 1753-01-01 až 9999-12-31 (YYYY-MM-DD hh:mm:ss[.nnn]) |
8 B |
datetime2 | 0001-01-01 00:00:00.0000000 až 9999-12-31 23:59:59.9999999 (YYYY-MM-DD hh:mm:ss[.nnnnnnn]) |
6-8 B |
datetimeoffset | 0001-01-01 00:00:00.0000000 až 9999-12-31 23:59:59.9999999 (UTC) (YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm) |
8-10 B |
smalldatetime | 1900-01-01 až 2079-06-06 (YYYY-MM-DD hh:mm:ss) |
4 B |
time | 00:00:00.0000000 až 23:59:59.9999999 (hh:mm:ss[.nnnnnnn]) |
3-5 B |
Klasické řetězce
Nejtradičnější pro ukládání řetězců jsou samozřejmě char a varchar. U obou se stanovuje délka, liší se ve způsobu uložení dat. Char se používá pro řetězce s alespoň přibližně konstantní délkou a zabírá přesně tolik místa, kolik je určeno při deklaraci (n). Velikost typu varchar se naproti tomu mění podle uložených dat a zabírá v paměti aktuální délku dat (m) + 2 B. Není-li délka stanovena, je rovna 1.
Datový typ text je podle dokumentace považován za zastaralý, je doporučeno místo něj používat varchar(max).
Název | Rozsah | Velikost |
char | 1 až 8 000 znaků | n B |
varchar | 1 až 8 000 znaků | m + 2 B |
varchar(max) | 1 až 231-1 B | m + 2 B |
Řetězce Unicode
K ukládání znaků ze sady Unicode slouží analogie výše zmíněných typů. Jsou jimi: nchar, nvarchar a ntext (který je opět doporučeno nepoužívat). Platí pro ně stejná pravidla, pouze rozsahy jsou poloviční (zabírají v paměti dvojnásobek místa).
Název | Rozsah | Velikost |
nchar | 1 až 4 000 znaků | 2n B |
nvarchar | 1 až 8 000 znaků | 2m + 2 B |
nvarchar(max) | 1 až 231-1 B | 2m + 2 B |
Binární data
Pole pro binární data (obrázky, zvuky...) jsou podobná polím pro znakové řetězce. Datové typy pro ně jsou tři - binary, varbinary a image. Deklarují se s parametrem, který určuje velikost (délku) uložitelných informací.
Podobně jako text u znakových řetězců není doporučeno nadále používat image, protože se s ním do budoucna nepočítá.
Název | Rozsah | Velikost |
binary | 1 až 8 000 | n B |
varbinary | 1 až 8 000 | m + 2 B |
varbinary(max) | 1 až 231-1 | m + 2 B |
Pracujeme s prostorem - geografie a geometrie
Novinkou systému SQL Server 2008 byly dva typy speciálně určené pro ukládání prostorových informací (umístění a tvary). Prvním je geography a používá se, pokud pracujeme se zeměpisnou šířkou (latitude) a délkou (longitude), protože počítá se zakřivením zemského povrchu.
Druhý datový typ se jmenuje geometry. Používá se u rozměrů, kde zakřivení Země není třeba brát v úvahu - vzdálenosti kanceláří v budově, velikost skladu apod. -, protože pracuje s "placatými" souřadnicemi.
Data se konstruují z vektorových objektů pomocí několika metod a vyžadují jistou přípravu. Rozsáhlý článek o prostorových datech najdete v MSDN Magazine February 2008.
Ostatní...
Nakonec se podíváme na zvláštní typy, které se nevešly do žádné z výše popsaných kategorií.
Každá tabulka smí mít nanejvýš jeden sloupec typu rowversion. Hodnota se automaticky mění při každé změně/vložení řádku, takže je s jeho pomocí možné sledovat změny v tabulce. Informace je ovšem interní, takže není možné ji spojit s reálným časem (k romu slouží typy pro práci s datem a časem).
Dokumentace uvádí, že datový typ timestamp je zastaralý a měl by být nahrazován synonymem rowversion. Nicméně Visual Studio 2008 toto nerespektuje a neumožňuje pole typu rowversion vytvářet. Uvidíme, co přinese nová verze.
Ke stanovení hierarchických vztahů mezi daty slouží typ hierarchyid, který umožňuje v databázi sestavovat a spravovat stromovou strukturu. Poskytuje několik metod, s nimiž lze ve skriptech tvořit mocné dotazy na pozici ve struktuře ("Kdo jsou podřízení podřízených X?" apod.). Práce s tímto typem je o něco komplikovanější, pro praktický příklad a další informace doporučuji navšívit článek na Microsoft Technet.
Jedinečné identifikátory (GUID) ve formě xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (kde každé x je hexadecimální číslice) spravuje datový typ uniqueidentifier. Vkládat data lze buď převedením z textového řetězce (ve zmíněném formátu), nebo funkcí NEWID()
.
Chceme-li do jednoho sloupce ukládat data, která budou mít v řádcích různý typ, deklarujeme jej jako sql_variant. Datové typy, které sql_variant obsahovat nesmí, jsou tyto: varchar(max), varbinary(max), nvarchar(max), xml, text, ntext, image, timestamp, sql_variant, hierarchyid, geography, geometry a uživatelské typy. Maximální velikost dat je 8 000 bajtů.
Nakonec datový typ xml slouží k ukládání objektů typu XML s maximální velikostí 2 GB.
Závěr
Tolik stručný průřez datovými typy, podrobné informace naleznete na stránkách zmíněných níže.
Zdroje a odkazy pro další informace: