Hledáš dárek, který neskončí v koši? Nyní 90 % extra kreditů ZDARMA s promo kódem PREKVAPENI90. Zjisti více:
NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

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,6­85,477.58 až 922,337,203,6­85,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řesné číselné typy - MS-SQL databáze krok za krokem

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řesnost n a 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řesnost n a 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řesnost n a 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:

Datum a čas - MS-SQL databáze krok za krokem

Ř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á n bajtů. 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:

Řetězce - MS-SQL databáze krok za krokem

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:

Binární typy - MS-SQL databáze krok za krokem

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žívejme DATETIME2. 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:

Ostatní datové typy - MS-SQL databáze krok za krokem

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


 

Předchozí článek
MS-SQL krok za krokem: Transakce
Všechny články v sekci
MS-SQL databáze krok za krokem
Přeskočit článek
(nedoporučujeme)
MS-SQL krok za krokem: Uživatelé a oprávnění
Článek pro vás napsal Ondřej Trnka
Avatar
Uživatelské hodnocení:
329 hlasů
OT
Aktivity