Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.
IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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,6­85,477.58 až 922,337,203,6­85,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:

Presné číselné typy - MS-SQL databázy krok za krokom

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ť n a 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ť n a 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ť n a 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:

Dátum a čas - MS-SQL databázy krok za krokom

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á n bajtov. 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:

Reťazce - MS-SQL databázy krok za krokom

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:

Binárne typy - MS-SQL databázy krok za krokom

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žívajme DATETIME2. V pamäti zaberá 8 bajtov.
  • UNIQUEIDENTIFIER – Dátový typ, ktorý v spojení napríklad s funkciou NEWID() 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:

Ostatné dátové typy - MS-SQL databázy krok za krokom

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.


 

Predchádzajúci článok
MS-SQL krok za krokom: Transakcie
Všetky články v sekcii
MS-SQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
MS-SQL krok za krokom: Používatelia a oprávnenia
Článok pre vás napísal Ondřej Trnka
Avatar
Užívateľské hodnotenie:
23 hlasov
OT
Aktivity