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 lekcii MS-SQL podrobnejšie pozrieme 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ž v 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 unikóde
- Binárne reťazce
- Ostatné dátové typy
Presné čísla
Dátové typy reprezentujúce celé čísla 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 |
Dátový tip reprezentujúci pravdu / nepravdu 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äť 1 bajt. Pre 9-17 polí 2 bajty atď.
Dátové typy reprezentujúce desatinné čísla sú decimal
alebo numeric. Funkčne sú tieto dva typy rovnaké.
Deklarujú sa zápisom decimal (precision, scale), kde:
precisionje maximálny počet číslic (miest) vľavo aj vpravo od desatinnej čiarky, môže nadobúdať hodnoty od 1 do 38,scaleje maximálny počet desatinných miest vpravo od desatinnej čiarky (teda presnosť desatinnej časti).
Pamäťová náročnosť dátového typu decimal podľa
precision:
| Dátový typ | Precision | 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 |
Dátové typy money a smallmoney predstavujú menu
a vyznačujú sa tým, že majú stanovený maximálny počet desatinných miest
na štyri desatinné miesta:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
| 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 |
Ukážme si jednoduchý príklad:
CREATE TABLE [dbo].[Example1] ( [Column1] [bigint] NULL, [Column2] [int] NULL, [Column3] [smallint] NULL, [Column4] [tinyint] NULL, [Column5] [bit] NULL, [Column6] [decimal](8, 3) NULL, [Column7] [money] NULL, [Column8] [smallmoney] NULL ) ON [PRIMARY]; GO INSERT INTO [dbo].[Example1] ([Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8]) VALUES ( -12345678964125874, 2147483647, 32767, 254, 0, 16.458, 100, 500 );
Vo Visual Studiu sa nám zobrazí:

Približné čísla
Približné čísla používajú plávajúcu desatinnú čiarku, preto ich hodnota nemôže byť vždy vyjadrená presne.
Tieto čísla reprezentuje 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 |
Tieto dátové typy deklarujeme v T-SQL takto:
CREATE TABLE [dbo].[Example2] ( [Column1] [float] NULL, [Column2] [real] NULL);
Dátum a čas
Dátové typy reprezentujúce dátum alebo čas:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
| Date | 0001-01-01 až 9999-12-31 | 3 bajty |
| Time | 00:00:00.000 až 23:59:59.999 | 5 bajtov |
| Datetime | Rozsah pre dátum 01.01.1753 až 31.12.9999 Rozsah pre čas 00:00:00 až 23:59:59.997 | 8 bajtov |
| Datetime2(n) | Rozsah pre dátum 01.01.0001 až 31.12.9999 Rozsah pre čas 00:00:00 až 23:59:59.9999999 | Podľa presnosti od 6 bajtov do 8 bajtov |
| Datetimeoffset | Rozsah pre dátum 01.01.0001 až 31.12.9999 Rozsah pre čas 00:00:00 až 23:59:59.9999999 Rozsah pre časovú zónu -14:00 až +14:00 | 10 bajtov |
| Smalldatetime | Rozsah pre dátum 01.01.1900 až 06.06.2079 Rozsah pre čas 00:00:00 až 23:59:00 | 4 bajty |
Popíšme si v skratke ich význam:
Date– používa sa na uloženie dátumu.Time– používa sa na uloženie času.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ť a tým ovplyvniť potrebnú pamäť.Datetimeoffset– používa sa na uloženie kombinácie dátumu a času vrátane časovej zóny.Smalldatetime– používa sa na uloženie kombinácie dátumu a času dňa, sekundy sú vždy nula, desatiny sekúnd nie sú použité.
Príklad:
CREATE TABLE [dbo].[Example3] ( [Column1] [date] NULL, [Column2] [time](7) NULL, [Column3] [datetime]NULL, [Column4] [datetime2](7) NULL, [Column5] [datetimeoffset](7) NULL, [Column6] [smalldatetime] NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Example3] ([Column1] ,[Column2] ,[Column3] ,[Column4] ,[Column5] ,[Column6]) 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');
Vo Visual Studiu sa nám zobrazí:

Reťazce
Pre textové reťazce máme k dispozícii:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
| Char(n) | Pevná dĺžka, n 1 až 8000 | n bajtov (bude rezervované miesto) |
| Varchar( n/max) | Variabilná dĺžka, n 1 až 8000, max indikuje maximálnu možnú dĺžku | n bajtu + 2 max = 231−1 bajtov |
Príklad:
CREATE TABLE [dbo].[Example4] ( [Column1] [char](10) NULL, [Column2] [varchar](10) NULL, [Column3] [varchar] (max) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Example4] ([Column1] ,[Column2] ,[Column3] ) VALUES ('abcdefghij', 'abc', 'abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcde fghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghija bcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefgh ijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' );
Vo Visual Studiu sa nám zobrazí:

Reťazce s podporou unikódu
Ďalšie dva typy s používajú na ukladanie reťazcov v unikóde, tzn. na uloženie každého znaku budú použité dva bajty. Je možné tak ukladať národné znaky, napríklad diakritiku:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
| nchar(n) | Pevná dĺžka, n 1 až 4000 | n x 2 bajty (bude rezervované miesto) |
| nvarchar( n/max) | Variabilná dĺžka, n 1 až 4000, max indikuje maximálnu možnú dĺžku | n x 2 bajtu + 2 max = 231−1 bajtov |
Príklad:
CREATE TABLE [dbo].[Example5] ( [Column1] [nchar] (10) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Example5] ([Column1]) VALUES ('ěščřžýáíé');
Výstup:

Binárne reťazce
Na ukladanie binárnych súborov, napríklad obrázkov, priamo do databázy sa používa:
| Dátový typ | Rozsah | Pamäť potrebná na uloženie |
|---|---|---|
| Binary (n) | Pevná dĺžka, n 1 až 8000 | n bajtov (bude rezervované miesto) |
| varbinary( n/max) | Variabilná dĺžka, n 1 až 8000, max indikuje maximálnu možnú dĺžku | n x 2 bajtu + 2 max = 231−1 bajtov |
Príklad:
CREATE TABLE [dbo].[Example6] ( [Column1] [binary](500) NULL, [Column2] [varbinary](500) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[Example6] ([Column1],[Column2]) VALUES (convert(binary, 'sdkaldjwi235486werfsfg3125h3ouršáhkjíěéýřžéščínřvéěínřzcfdgdfhb654'), convert(binary, 'sdkaldjwi235486werfsfg3125h3ouršáhkjíěéýřžéščínřvéěínřzcfdgdfhb654') );
Výstup:

Ostatné dátové typy
Spomeňme ešte posledné dva dátové typy T-SQL:
Timestamp– je dátový typ, ktorý generuje jedinečné binárne číslo, ktoré sa používa na rozlíšenie verzie riadkov "rowversion". Tento dátový typ neukladá dátum a čas! Na uloženie dátumu a času používajtedatetime2. V pamäti zaberá 8 bajtov.Uniqueidentifier– je dátový typ, ktorý v spojení napríklad s funkciouNEWID()vygeneruje unikátny identifikátor. V pamäti zaberá 16 bajtov.
Príklad:
CREATE TABLE [dbo].[Example7] ( [Column1] [uniqueidentifier] NULL DEFAULT (newid()), [Column2] [Timestamp], [Column3] [char] (3) ) ON [PRIMARY] GO INSERT INTO [dbo].[Example7] ([Column3]) VALUES ('abc');
Výstup:

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.
