18. diel - MS-SQL - Dátové typy podrobnejšie
V predchádzajúcej lekcii, MS-SQL krok za krokom: Transakcie, sme sa venovali transakciám.
Dnes sa v MS-SQL tutoriáli pozrieme podrobnejšie na dátové typy. Každý stĺpec, lokálna premenná alebo parameter má atribút, ktorý špecifikuje dátový typ. Dátové typy sú veľmi dôležitá súčasť návrhu tabuľky a je zložité ich po návrhu meniť. Preto je dôležité venovať im pozornosť už na začiatkoch projektu.
Dátové typy môžeme rozdeliť do týchto skupín:
- presné čísla,
- približné čísla,
- dátum a čas,
- reťazce,
- reťazce v Unicode,
- binárne reťazce,
- ostatné dátové typy.
Presné čísla
Táto skupina zahŕňa celé čísla, desatinné čísla s pevnou presnosťou a typy pre menu.
Celé čísla
Dátové typy reprezentujúce celé čísla sú BIGINT,
INT, SMALLINT, TINYINT:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
BIGINT |
-263 až 263 | 8 bajtov |
INT |
-231 až 231 | 4 bajty |
SMALLINT |
-215 až 215 | 2 bajty |
TINYINT |
0 až 255 | 1 bajt |
Logická hodnota
Dátový typ reprezentujúci pravdu/nepravdu je BIT:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
BIT |
0 až 1 | 1 bit |
Pre dátový typ BIT optimalizuje MS-SQL pamäť, ak je v
tabuľke uložených 8 alebo menej polí s typom BIT, použije sa
pamäť s veľkosťou 1 bajt. Pre 9-17 polí 2 bajty atď.
Desatinné čísla s pevnou presnosťou
Dátové typy reprezentujúce desatinné čísla sú DECIMAL
alebo NUMERIC. Funkčne sú tieto dva typy rovnaké a deklarujú sa
nasledovne:
DECIMAL (precision, scale)
Kde je:
precision(celková presnosť) – Maximálny celkový počet číslic (naľavo aj napravo od desatinnej čiarky). Môže nadobúdať hodnoty od 1 do 38.scale(škála/meradlo) – Maximálny počet číslic napravo od desatinnej čiarky.
Využitie pamäte pri možných presnostiach je nasledujúce:
| Dátový typ | Celková presnosť | Pamäť potrebná na uloženie |
|---|---|---|
DECIMAL |
1-9 | 5 bajtov |
DECIMAL |
10-19 | 9 bajtov |
DECIMAL |
20-28 | 13 bajtov |
DECIMAL |
29-38 | 17 bajtov |
Menové typy
Dátové typy MONEY a SMALLMONEY reprezentujú menu
a sú optimalizované pre finančné dáta. Majú pevnú presnosť štyroch
desatinných miest:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
MONEY |
-922,337,203,685,477.58 až 922,337,203,685,477.58 | 8 bajtov |
SMALLMONEY |
- 214,748.3648 až 214,748.3647 | 4 bajty |
Príklad
Uveďme si jednoduchý príklad tabuľky, ktorá využíva všetky doteraz uvedené typy:
CREATE TABLE [KatalogProduktov]( [ProduktId] BIGINT NOT NULL PRIMARY KEY, [DodavatelId] INT NOT NULL, [Nazov] NVARCHAR (100) NOT NULL, [NaSklade] SMALLINT NULL, [Aktivny] BIT NULL, [KategoriaTier] TINYINT NULL, [ZakladnaCena] DECIMAL (10, 2) NOT NULL, [Naklady] MONEY NULL, [ManipulacnyPoplatok] SMALLMONEY NULL );
Záznam by sme do takej tabuľky pridali nasledovne:
INSERT INTO [KatalogProduktov] ( [ProduktId], [DodavatelId], [Nazov], [NaSklade], [Aktivny], [KategoriaTier], [ZakladnaCena], [Naklady], [ManipulacnyPoplatok] ) VALUES ( 150000000000, 10523, 'Luxusné kreslo XYZ', 250, 1, 5, 12450.99, 9800.50, 19.50 );
Výsledok:

Približné čísla
Približné čísla používajú plávajúcu desatinnú čiarku, a preto ich hodnota nemusí byť vždy vyjadrená s absolútnou presnosťou. Používame ich najmä na uloženie reálnych čísel.
Akým spôsobom v počítači reprezentujeme reálne čísla, sa dočítame v lekcii Reprezentácia čísel v počítači.
Používame pre ne dátový typ FLOAT(n), kde n je
počet bitov, ktoré sú použité na zápis mantisy pri vedeckom zápise
čísel:
| Dátový typ | n |
Pamäť potrebná na uloženie |
|---|---|---|
FLOAT(n) |
1-24 | 4 bajty |
FLOAT(n) |
25-53 | 9 bajtov |
Štandardné typy pre približné čísla:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
FLOAT |
- 1.79E+308 až -2.23E-308, 0 a 2.23E-308 až 1.79E+308 | 8 bajtov |
REAL |
- 3.40E + 38 až -1.18E - 38, 0 a 1.18E - 38 až 3.40E + 38 | 4 bajty |
Typ FLOAT je v skutočnosti FLOAT(53), ak nie je
špecifikované inak. Obdobne typ REAL je potom synonymum pre
FLOAT(24).
Príklad
Uveďme si opäť nejaký jednoduchý príklad tabuľky s týmito typmi:
CREATE TABLE [Poloha]( [Id] INT NOT NULL PRIMARY KEY, [ZemepisnaSirka] FLOAT NULL, [ZemepisnaDlzka] FLOAT NULL );
A vloženie záznamu:
INSERT INTO [Poloha] ([Id], [ZemepisnaSirka], [ZemepisnaDlzka]) VALUES (1, 49.5937100, 17.3956400);
Dátum a čas
Dátové typy reprezentujúce dátum alebo čas máme nasledujúce:
DATE– Používa sa na uloženie samotného dátumu.TIME(n)– Používa sa na uloženie samotného času. Je možné použiť presnosťna tým ovplyvniť potrebnú pamäť.DATETIME– Používa sa na uloženie kombinácie dátumu a času.DATETIME2(n)– Používa sa na uloženie kombinácie dátumu a času. Je možné použiť presnosťna tým ovplyvniť potrebnú pamäť.DATETIMEOFFSET(n)– Používa sa na uloženie kombinácie dátumu a času vrátane časovej zóny. Je možné použiť presnosťna tým ovplyvniť potrebnú pamäť.SMALLDATETIME– Používa sa na uloženie kombinácie dátumu a času dňa. Sekundy sú vždy nula a desatiny sekúnd nie sú použité.
Tabuľka rozsahov a využitia pamäte:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
DATE |
0001-01-01 až 9999-12-31 | 3 bajty |
TIME(n) |
00:00:00.000 až 23:59:59.999 | Podľa presnosti od 3 do 5 bajtov |
DATETIME |
Pre dátum 01.01.1753 až 31.12.9999 a pre čas 00:00:00 až 23:59:59.997 | 8 bajtov |
DATETIME2(n) |
Pre dátum 01.01.0001 až 31.12.9999 a pre čas 00:00:00 až 23:59:59.9999999 | Podľa presnosti od 6 do 8 bajtov |
DATETIMEOFFSET(n) |
Pre dátum 01.01.0001 až 31.12.9999, pre čas 00:00:00 až 23:59:59.9999999 a pre časovú zónu -14:00 až +14:00 | Podľa presnosti od 8 do 10 bajtov |
SMALLDATETIME |
Pre dátum 01.01.1900 až 06.06.2079 a pre čas 00:00:00 až 23:59:00 | 4 bajty |
Príklad
Majme príklad tabuľky používajúcej tieto dátové typy:
CREATE TABLE [PlanovanyTermin]( [TerminId] INT NOT NULL PRIMARY KEY, [NazovStretnutia] NVARCHAR (100) NOT NULL, [DatumKonania] DATE NULL, [DobaTrvania] TIME (7) NULL, [ZaciatokStretnutia] DATETIME NULL, [ZaciatokStretnutiaTZ] DATETIMEOFFSET (7) NULL, [KoniecStretnutia] DATETIME2 (7) NULL, [PoslednaUprava] SMALLDATETIME NULL );
Nejaký záznam by sme do takej tabuľky pridali nasledovne:
INSERT INTO [PlanovanyTermin] ( [TerminID], [NazovStretnutia], [DatumKonania], [DobaTrvania], [ZaciatokStretnutia], [KoniecStretnutia], [ZaciatokStretnutiaTZ], [PoslednaUprava] ) VALUES ( 1, 'Kvartálny prehľad 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ýsledok:

Reťazce
Najprv si uvedieme dátové typy CHAR a VARCHAR na
uloženie textových reťazcov, ktoré nepodporujú Unicode. Takéto dátové
typy používajú iba jednobajtové kódovanie, napríklad ASCII, kde je každý
znak reprezentovaný iba jedným bajtom:
CHAR(n)– Vždy zaberánbajtov. Ak je uložený reťazec kratší, doplní sa medzerami.VARCHAR(n/max)– Ukladá iba skutočný počet znakov plus dva bajty na uloženie dĺžky. Šetrí miesto, ale môže byť mierne pomalší nežCHAR.
Tieto typy nie sú vhodné na uloženie diakritiky alebo iných národných znakov.
Akým spôsobom sa v počítači reprezentujú textové znaky, sa dočítame v lekcii Babylonské zmätenie kódovania.
Tabuľka rozsahov a využitia pamäte:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
CHAR(n) |
Pevná dĺžka, n je od 1 po 8000 |
n bajtov (bude rezervované miesto) |
VARCHAR(n/max) |
Variabilná dĺžka, n je od 1 po 8000, max
indikuje maximálnu možnú dĺžku |
n + 2 bajty alebo pre max 231−1
bajtov |
Reťazce s podporou Unicode
Dátové typy na uloženie textových reťazcov s podporou Unicode sú
NCHAR a NVARCHAR. Používajú sa na uloženie
národných znakov vrátane diakritiky. Na uloženie každého znaku budú
použité dva bajty:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
NCHAR(n) |
Pevná dĺžka, n je od 1 po 4000 |
n x 2 bajtov (bude rezervované miesto) |
NVARCHAR(n/max) |
Variabilná dĺžka, n je od 1 po 4000, max
indikuje maximálnu možnú dĺžku |
2 * n + 2 bajty alebo pre max 231−1
bajtov |
Príklad
Uveďme si opäť nejaký jednoduchý príklad tabuľky využívajúcej tieto dátové typy:
CREATE TABLE [RegistraciaPouzivatela]( [PouzivatelId] INT NOT NULL PRIMARY KEY, [KodKrajiny] CHAR (2) NULL, [Email] VARCHAR (100) NULL, [KodMeny] NCHAR (5) NULL, [MenoPriezvisko] NVARCHAR (100) NULL, [Recenzia] NVARCHAR (max) NULL );
Záznam by sme vložili nasledovne:
INSERT INTO [RegistraciaPouzivatela] ( [PouzivatelId], [KodKrajiny], [Email], [KodMeny], [MenoPriezvisko], [Recenzia] ) VALUES ( 1, 'SK', '[email protected]', '€', 'Peter Čierny', 'Produkt splnil moje očakávania. Ďakujem za rýchle doručenie.' );
Výsledok:

Visual Studio nezobrazuje vo výsledkoch všetku diakritiku, čo je normálne a nemá to na dáta žiadny vplyv.
Binárne reťazce
Dátové typy na uloženie binárnych dát (napríklad obrázky, súbory) priamo do databázy sú:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
BINARY(n) |
Pevná dĺžka, n je od 1 po 8000 |
n bajtov (bude rezervované miesto) |
VARBINARY(n/max) |
Variabilná dĺžka, n je od 1 po 8000, max
indikuje maximálnu možnú dĺžku |
2 * n + 2 bajty alebo pre max 231−1
bajtov |
Príklad
Majme príklad tabuľky používajúcej tieto dátové typy:
CREATE TABLE [Dokumenty]( [DokumentId] INT NOT NULL PRIMARY KEY, [SifrovaciKluc] BINARY (16) NULL, [ObsahSuboru] VARBINARY (max) NULL );
Nejaký záznam by sme do takej tabuľky pridali nasledovne:
INSERT INTO [Dokumenty] ( [DokumentId], [SifrovaciKluc], [ObsahSuboru] ) VALUES ( 1, CONVERT(BINARY, '1234'), CONVERT(VARBINARY (max), 'Binárne dáta veľkého súboru (PDF, DOCX)') );
Výsledok:

Ostatné dátové typy
Nakoniec si ešte predstavíme typy pre špeciálnu identifikáciu a verzovanie:
TIMESTAMP– Dátový typ, ktorý generuje jedinečné binárne číslo, ktoré sa používa na rozlíšenie verzie riadkov, niekedy označované ako rowversion. Tento dátový typ neukladá dátum a čas! Na uloženie dátumu a času používajmeDATETIME2. V pamäti zaberá 8 bajtov.UNIQUEIDENTIFIER– Dátový typ, ktorý v spojení napríklad s funkciouNEWID()vygeneruje unikátny identifikátor (GUID). V pamäti zaberá 16 bajtov.
Príklad
Ako príklad si uvedieme jednoduchú tabuľku na nastavenia:
CREATE TABLE [Nastavenia]( [NastaveniaGUID] UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()), [VerziaZaznamu] TIMESTAMP, [NazovParametra] NVARCHAR (50) NOT NULL );
Pretože sa TIMESTAMP generuje automaticky a hodnota stĺpca
NastaveniaGUID vďaka použitiu funkcie NEWID() ako
predvolenej hodnoty taktiež, tak pri vkladaní riadku stačí uviesť iba
zostávajúci stĺpec NazovParametra:
INSERT INTO [Nastavenia] ([NazovParametra]) VALUES ('DefaultTheme');
Výsledok:

V nasledujúcej lekcii, MS-SQL krok za krokom: Používatelia a oprávnenia, sa naučíme pracovať s používateľskými účtami. Naučíme sa ich vytvárať, mazať a prideľovať im oprávnenia.