Lekce 18 - MS-SQL - Datové typy podrobněji
V minulé lekci, MS-SQL krok za krokem: Transakce, jsme se věnovali transakcím.
Dnes se v MS-SQL tutoriálu podíváme podrobněji na datové typy. Každý sloupec, lokální proměnná nebo parametr má atribut, který specifikuje datový typ. Datové typy jsou velice důležitá součást návrhu tabulky a je složité je po návrhu měnit. Proto je důležité věnovat jim pozornost už v počátcích projektu.
Datové typy můžeme rozdělit do těchto skupin:
- přesná čísla,
- přibližná čísla,
- datum a čas,
- řetězce,
- řetězce v unikódu,
- binární řetězce,
- ostatní datové typy.
Přesná čísla
Tato skupina zahrnuje celá čísla, desetinná čísla s pevnou přesností a typy pro měnu.
Celá čísla
Datové typy reprezentující celá čísla jsou BIGINT,
INT, SMALLINT, TINYINT:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
BIGINT |
-263 až 263 | 8 bajtů |
INT |
-231 až 231 | 4 bajty |
SMALLINT |
-215 až 215 | 2 bajty |
TINYINT |
0 až 255 | 1 bajt |
Logická hodnota
Datový typ reprezentující pravdu/nepravdu je BIT:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
BIT |
0 až 1 | 1 bit |
Pro datový typ BIT optimalizuje MS-SQL paměť, pokud je v
tabulce uloženo 8 nebo méně polí s typem BIT použije se
paměť o velikosti 1 bajt. Pro 9-17 polí 2 bajty atd.
Desetinná čísla s pevnou přesností
Datové typy reprezentující desetinná čísla jsou DECIMAL
nebo NUMERIC. Funkčně jsou tyto dva typy stejné a deklarují se
následovně:
DECIMAL (precision, scale)
Kde je:
precision(celková přesnost) – Maximální celkový počet číslic (nalevo i napravo od desetinné čárky). Může nabývat hodnot od 1 do 38.scale(škála/měřítko) – Maximální počet číslic napravo od desetinné čárky.
Využití paměti při možných přesnostech je následující:
| Datový typ | Celková přesnost | Paměť potřebná pro uložení |
|---|---|---|
DECIMAL |
1-9 | 5 bajtů |
DECIMAL |
10-19 | 9 bajtů |
DECIMAL |
20-28 | 13 bajtů |
DECIMAL |
29-38 | 17 bajtů |
Měnové typy
Datové typy MONEY a SMALLMONEY reprezentují měnu
a jsou optimalizovány pro finanční data. Mají pevnou přesnost čtyř
desetinných míst:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
MONEY |
-922,337,203,685,477.58 až 922,337,203,685,477.58 | 8 bajtů |
SMALLMONEY |
- 214,748.3648 to 214,748.3647 | 4 bajty |
Příklad
Uveďme si jednoduchý příklad tabulky, která využívá všechny dosud uvedené typy:
CREATE TABLE [KatalogProdukt]( [ProduktId] BIGINT NOT NULL PRIMARY KEY, [DodavatelId] INT NOT NULL, [Nazev] NVARCHAR (100) NOT NULL, [Skladem] SMALLINT NULL, [Aktivni] BIT NULL, [KategorieTier] TINYINT NULL, [CenaZakladni] DECIMAL (10, 2) NOT NULL, [Naklady] MONEY NULL, [ManipulacniPoplatek] SMALLMONEY NULL );
Záznam bychom do takové tabulky přidali následovně:
INSERT INTO [KatalogProdukt] ( [ProduktId], [DodavatelId], [Nazev], [Skladem], [Aktivni], [KategorieTier], [CenaZakladni], [Naklady], [ManipulacniPoplatek] ) VALUES ( 150000000000, 10523, 'Luxusní Křeslo XYZ', 250, 1, 5, 12450.99, 9800.50, 19.50 );
Výsledek:

Přibližná čísla
Přibližná čísla používají plovoucí desetinnou čárku, a proto nemusí být jejich hodnota vždy vyjádřena s absolutní přesností. Používáme je zejména pro uložení reálných čísel.
Jakým způsobem v počítači reprezentujeme reálná čísla se dočteme v lekci Reprezentace čísel v počítači.
Používáme pro ně datový typ FLOAT(n), kde n je
počet bitů, které jsou použity k zápisu mantisy při vědeckém zápisu
čísel:
| Datový typ | n |
Paměť potřebná pro uložení |
|---|---|---|
FLOAT(n) |
1-24 | 4 bajty |
FLOAT(n) |
25-53 | 9 bajtů |
Standardní typy pro přibližná čísla:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
FLOAT |
- 1.79E+308 až -2.23E-308, 0 a 2.23E-308 až 1.79E+308 | 8 bajtů |
REAL |
- 3.40E + 38 až -1.18E - 38, 0 a 1.18E - 38 až 3.40E + 38 | 4 bajty |
Typ FLOAT je ve skutečnosti FLOAT(53), pokud není
specifikováno jinak. Obdobně typ REAL je pak synonymum pro
FLOAT(24).
Příklad
Uveďme si opět nějaký jednoduchý příklad tabulky s těmito typy:
CREATE TABLE [Poloha]( [Id] INT NOT NULL PRIMARY KEY, [ZemSirka] FLOAT NULL, [ZemDelka] FLOAT NULL );
A vložení záznamu:
INSERT INTO [Poloha] ([Id], [ZemSirka], [ZemDelka]) VALUES (1, 49.5937100, 17.3956400);
Datum a čas
Datové typy reprezentující datum nebo čas máme následující:
DATE– Používá se pro uložení samotného datumu.TIME(n)– Používá se pro uložení samotného času. Je možné použít přesnostna tím ovlivnit potřebnou paměť.DATETIME– Používá se pro uložení kombinace datumu a času.DATETIME2(n)– Používá se pro uložení kombinace datumu a času. Je možné použít přesnostna tím ovlivnit potřebnou paměť.DATETIMEOFFSET(n)– Používá se pro uložení kombinace datumu a času včetně časové zóny. Je možné použít přesnostna tím ovlivnit potřebnou paměť.SMALLDATETIME– Používá se pro uložení kombinace data a času dne. Sekundy jsou vždy nula a desetiny sekund nejsou použity.
Tabulka rozsahů a využití paměti:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
DATE |
0001-01-01 až 9999-12-31 | 3 bajty |
TIME(n) |
00:00:00.000 až 23:59:59.999 | Podle přesnosti od 3 do 5 bajtů |
DATETIME |
Pro datum 01.01.1753 až 31.12.9999 a pro čas 00:00:00 až 23:59:59.997 | 8 bajtů |
DATETIME2(n) |
Pro datum 01.01.0001 až 31.12.9999 a pro čas 00:00:00 až 23:59:59.9999999 | Podle přesnosti od 6 do 8 bajtů |
DATETIMEOFFSET(n) |
Pro datum 01.01.0001 až 31.12.9999, pro čas 00:00:00 až 23:59:59.9999999 a pro časovou zónu -14:00 až +14:00 | Podle přesnosti od 8 do 10 bajtů |
SMALLDATETIME |
Pro datum 01.01.1900 až 06.06.2079 a pro čas 00:00:00 až 23:59:00 | 4 bajty |
Příklad
Mějme příklad tabulky používající tyto datové typy:
CREATE TABLE [PlanovanyTermin]( [TerminId] INT NOT NULL PRIMARY KEY, [NazevSchuzky] NVARCHAR (100) NOT NULL, [DatumKonani] DATE NULL, [DobaTrvani] TIME (7) NULL, [ZacatekSchuzky] DATETIME NULL, [ZacatekSchuzkyTZ] DATETIMEOFFSET (7) NULL, [KonecSchuzky] DATETIME2 (7) NULL, [PosledniUprava] SMALLDATETIME NULL );
Nějaký záznam bychom do takové tabulky přidali následovně:
INSERT INTO [PlanovanyTermin] ( [TerminID], [NazevSchuzky], [DatumKonani], [DobaTrvani], [ZacatekSchuzky], [KonecSchuzky], [ZacatekSchuzkyTZ], [PosledniUprava] ) VALUES ( 1, 'Kvartální přehled Q4', '2025-12-10', '01:30:00.0000000', '2025-12-10 14:00:00.997', '2025-12-10 15:30:00.9999999', '2025-12-10 14:00:00.0000000 +01:00', '2025-12-08 17:15' );
Výsledek:

Řetězce
Nejprve si uvedeme datové typy CHAR a VARCHAR pro
uložení textových řetězců, které nepodporují Unicode. Takové datové
typy používají pouze jednobajtové kódování, například ASCII, kde je
každý znak reprezentován pouze jedním bajtem:
CHAR(n)– Vždy zabíránbajtů. Pokud je uložený řetězec kratší, doplní se mezerami.VARCHAR(n/max)– Ukládá pouze skutečný počet znaků plus dva bajty pro uložení délky. Šetří místo, ale může být mírně pomalejší nežCHAR.
Tyto typy nejsou vhodné pro uložení diakritiky nebo jiných národních znaků.
Jakým způsobem se v počítači reprezentují textové znaky se dočteme v lekci Babylonské zmatení kódování.
Tabulka rozsahů a využití paměti:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
CHAR(n) |
Pevná délka, n je od 1 po 8000 |
n bajtů (bude rezervováno místo) |
VARCHAR(n/max) |
Variabilní délka, n je od 1 po 8000, max
indikuje maximální možnou délku |
n + 2 bajty nebo pro max 231−1
bajtů |
Řetězce s podporou Unicode
Datové typy pro uložení textových řetězců s podporou Unicode jsou
NCHAR a NVARCHAR. Používají se pro uložení
národních znaků, včetně diakritiky. Na uložení každého znaku budou
použity dva bajty:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
NCHAR(n) |
Pevná délka, n je od 1 po 4000 |
n x 2 bajtů (bude rezervováno místo) |
NVARCHAR(n/max) |
Variabilní délka, n je od 1 po 4000, max
indikuje maximální možnou délku |
2 * n + 2 bajtů nebo pro max 231−1
bajtů |
Příklad
Uveďme si opět nějaký jednoduchý příklad tabulky využívající tyto datové typy:
CREATE TABLE [RegistraceUzivatele]( [UzivatelId] INT NOT NULL PRIMARY KEY, [KodZeme] CHAR (2) NULL, [Email] VARCHAR (100) NULL, [KodMeny] NCHAR (5) NULL, [JmenoPrijmeni] NVARCHAR (100) NULL, [Recenze] NVARCHAR (max) NULL );
Záznam bychom vložili následovně:
INSERT INTO [RegistraceUzivatele] ( [UzivatelId], [KodZeme], [Email], [KodMeny], [JmenoPrijmeni], [Recenze] ) VALUES ( 1, 'CZ', '[email protected]', 'Kč', 'Petr Černý', 'Produkt splnil mé očekávání. Děkuji za rychlé doručení.' );
Výsledek:

Visual Studio nezobrazuje ve výsledcích veškerou diakritiku, což je normální a nemá to na data žádný vliv.
Binární řetězce
Datové typy pro uložení binárních dat (například obrázky, soubory) přímo do databáze jsou:
| Datový typ | Rozsah | Paměť potřebná pro uložení |
|---|---|---|
BINARY(n) |
Pevná délka, n je od 1 po 8000 |
n bajtů (bude rezervováno místo) |
VARBINARY(n/max) |
Variabilní délka, n je od 1 po 8000, max
indikuje maximální možnou délku |
2 * n + 2 bajtů nebo pro max 231−1
bajtů |
Příklad
Mějme příklad tabulky používající tyto datové typy:
CREATE TABLE [Dokumenty]( [DokumentId] INT NOT NULL PRIMARY KEY, [Kryptoklic] BINARY (16) NULL, [SouborObsah] VARBINARY (max) NULL );
Nějaký záznam bychom do takové tabulky přidali následovně:
INSERT INTO [Dokumenty] ( [DokumentId], [Kryptoklic], [SouborObsah] ) VALUES ( 1, CONVERT(BINARY, '1234'), CONVERT(VARBINARY (max), 'Binární data velkého souboru (PDF, DOCX)') );
Výsledek:

Ostatní datové typy
Nakonec si ještě představíme typy pro speciální identifikaci a verzování:
TIMESTAMP– Datový typ, který generuje jedinečné binární číslo, které se používá na rozlišení verze řádků, někdy označováno jako rowversion. Tento datový typ neukládá datum a čas! Pro uložení data a času používejmeDATETIME2. V paměti zabírá 8 bajtů.UNIQUEIDENTIFIER– Datový typ, který ve spojení například s funkcíNEWID()vygeneruje unikátní identifikátor (GUID). V paměti zabírá 16 bajtů.
Příklad
Jako příklad si uvedeme jednoduchou tabulku pro nastavení:
CREATE TABLE [Nastaveni]( [NastaveniGUID] UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()), [VerzeZaznamu] TIMESTAMP, [NazevParametru] NVARCHAR (50) NOT NULL );
Protože se TIMESTAMP generuje automaticky a hodnota sloupce
NastaveniGUID díky použití funkce NEWID() jako
výchozí hodnoty taktéž, tak při vkládání řádku stačí uvést pouze
zbývající sloupec NazevParametru:
INSERT INTO [Nastaveni] ([NazevParametru]) VALUES ('DefaultTheme');
Výsledek:

V další lekci, MS-SQL krok za krokem: Uživatelé a oprávnění, se naučíme pracovat s uživatelskými účty. Naučíme se je vytvářet, mazat a přidělovat jim oprávnění.

