15. díl - MS-SQL - Datové typy podrobněji

MS-SQL krok za krokem MS-SQL - Datové typy podrobněji

Dnes bych bych chtěl doplnit pěkný článek od Michala Žurka o datových typech používaných v MS-SQL. 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,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

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!


 

  Aktivity (2)

Článek pro vás napsal Ondřej Trnka
Avatar

Jak se ti líbí článek?
Celkem (4 hlasů) :
55555


 


Miniatura
Předchozí článek
MS-SQL - Uložené procedury
Miniatura
Všechny články v sekci
MS-SQL databáze krok za krokem

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!