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
Datové typy reprezentující celá čísla „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 |
Datový tip reprezentující pravdu / nepravdu „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ěť 1 bajt. Pro 9-17 polí 2 bajty atd.
Datové typy reprezentující desetinná čísla „decimal“ nebo „numeric“. Funkčně jsou tyto dva typy stejné
Deklarují se takto: decimal (precision,scale )
- precision je maximální počet desetinných míst vlevo i vpravo od desetinné čárky, může nabývat hodnot od 1 do 38
- scale je maximální počet desetinných míst vpravo od desetinné čárky
Datový typ | Precision | 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ů |
Datové typy money a smallmoney reprezentují měnu a vyznačují se tím, že mají pouze dvě desetinná místa.
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
CREATE TABLE [dbo].[Priklad1]( [sloupec1] [bigint] NULL, [Sloupec2] [int] NULL, [Sloupec3] [smallint] NULL, [Sloupec4] [tinyint] NULL, [Sloupec5] [bit] NULL, [Sloupec6] [decimal](8, 3) NULL, [Sloupec7] [money] NULL, [Sloupec8] [smallmoney] NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Priklad1] ([sloupec1],[Sloupec2],[Sloupec3],[Sloupec4] ,[Sloupec5],[Sloupec6],[Sloupec7],[Sloupec8]) VALUES ( -12345678964125874, 2147483647, 32767, 254, 0, 16.458, 100, 500 )

Přibližná čísla
Přibližná čísla používají plovoucí desetinnou čárku, proto nemůže byt vždy jejich hodnota vyjádřena přesně.
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 |
Příklad
CREATE TABLE [dbo].[Priklad2]( [Sloupec1] [float] NULL, [Sloupec2] [real] NULL)
Datum a čas
Datové typy reprezentující datum nebo čas.
Datový typ | Rozsah | Paměť potřebná pro uložení |
---|---|---|
date | 0001-01-01 až 9999-12-31 | 3 bajty |
Time | 00:00:00.000 až 23:59:59.999 | 5 bajtů |
Datetime | Rozsah pro datum 01.01.1753 až 31.12.9999 Rozsah pro čas 00:00:00 až 23:59:59.997 | 8 bajtů |
Datetime2(n) | Rozsah pro datum 01.01.0001 až 31.12.9999 Rozsah pro čas 00:00:00 až 23:59:59.9999999 | Podle přesnosti od 6 bajtů do 8 bajtů |
Datetimeoffset | Rozsah pro datum 01.01.0001 až 31.12.9999 Rozsah pro čas 00:00:00 až 23:59:59.9999999 Rozsah pro časovou zónu -14:00 až +14:00 | 10 bajtů |
Smalldatetime | Rozsah pro datum 01.01.1900 až 06.06.2079 Rozsah pro čas 00:00:00 až 23:59:00 | 4 bajty |
- Date – používá se pro uložení datumu
- Time – používá se pro uložení času
- 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 – používá se pro uložení kombinace datumu a času včetně časové zóny
- Smalldatetime – používá se pro uložení kombinace data a času dne, sekundy jsou vždy nula, desetiny sekund nejsou použity
Příklad
CREATE TABLE [dbo].[Priklad1]( [sloupec1] [date] NULL, [Sloupec2] [time](7) NULL, [Sloupec3] [datetime]NULL, [Sloupec4] [datetime2](7) NULL, [Sloupec5] [datetimeoffset](7) NULL, [Sloupec6] [smalldatetime] NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Priklad1] ([sloupec1] ,[Sloupec2] ,[Sloupec3] ,[Sloupec4] ,[Sloupec5] ,[Sloupec6]) VALUES ('2016-05-14', '17:15:21.5', '2016-07-15 13:22:42.214', '2016-08-22 14:25:13.8856625', '2016-05-13 12:22:05.22 +8:00', '2016-05-18 12:58' )

Řetězce
Datový typ | Rozsah | Paměť potřebná pro uložení |
---|---|---|
Char(n) | Pevná délka, n 1 až 8000 | n bajtů (bude rezervováno místo) |
Varchar( n/max) | Variabilní délka, n 1 až 8000, max indikuje maximální možnou délku | n bajtu + 2 max = 231−1 bajtů |
Příklad
CREATE TABLE [dbo].[Priklad1]( [sloupec1] [char](10) NULL, [Sloupec2] [varchar](10) NULL, [Sloupec3] [varchar] (max) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Priklad1] ([sloupec1] ,[Sloupec2] ,[Sloupec3] ) VALUES ('abcdefghij', 'abc', 'abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcde fghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghija bcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefgh ijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' )

Řetězce s podporou unikódu
Datový typ | Rozsah | Paměť potřebná pro uložení |
---|---|---|
nchar(n) | Pevná délka, n 1 až 4000 | n x 2 bajtů (bude rezervováno místo) |
nvarchar( n/max) | Variabilní délka, n 1 až 4000, max indikuje maximální možnou délku | n x 2 bajtu + 2 max = 231−1 bajtů |
Používá se pro ukládání řetězců v unikódu, tzn. Na uložení každého znaku budou použity dva bajty. Lze tak ukládat národní znaky, například diakritiku.
Příklad
CREATE TABLE [dbo].[Priklad1]( [sloupec1] [nchar] (10) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Priklad1] ([sloupec1]) VALUES ('ěščřžýáíé')

Binární řetězce
Datový typ | Rozsah | Paměť potřebná pro uložení |
---|---|---|
Binary (n) | Pevná délka, n 1 až 8000 | n bajtů (bude rezervováno místo) |
varbinary( n/max) | Variabilní délka, n 1 až 8000, max indikuje maximální možnou délku | n x 2 bajtu + 2 max = 231−1 bajtů |
Používá se pro ukládání binárních souboru, například obrázku, přímo do databáze.
Příklad
CREATE TABLE [dbo].[Priklad1]( [sloupec1] [binary](500) NULL, [sloupec2] [varbinary](500) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Priklad1] ([sloupec1],[sloupec2]) VALUES (convert(binary, 'sdkaldjwi235486werfsfg3125h3ouršáhkjíěéýřžéščínřvéěínřzcfdgdfhb654'), convert(binary, 'sdkaldjwi235486werfsfg3125h3ouršáhkjíěéýřžéščínřvéěínřzcfdgdfhb654') )

Ostatní datové typy
- Timestamp – je datový typ, který generuje jedinečné binární číslo, které se používá na rozlišení verze řádků „rowversion“. Tento datový typ neukládá datum a čas! Pro uložení data a času používejte datetime2. V paměti zabírá 8 bajtů.
- Uniqueidentifier – je datový typ, který ve spojení například s funkcí NEWID() vygeneruje unikátní identifikátor. V paměti zabírá 16 bajtů.
Příklad
CREATE TABLE [dbo].[Priklad1]( [sloupec1] [uniqueidentifier] NULL DEFAULT (newid()), [sloupec2] [Timestamp], [sloupec3] [char] (3) ) ON [PRIMARY] GO INSERT INTO [dbo].[Priklad1] ([sloupec3]) VALUES ('abc')

Pokud máte dotazy, neváhejte se zeptat v komentářích!
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í.