Výběr správného datového typu pro sloupec tabulky je důležitým rozhodnutím. Snižuje potřebu převodů datových typů, zvyšuje výkon databázových dotazů a minimalizuje požadavky na úložiště.
V této příručce prozkoumáte různé typy dat, které se používají v systémech správy relačních databází (RDBMS). Tyto datové typy lze použít při vytváření nebo změně tabulky nebo při deklaraci proměnných v databázových uložených procedurách. Některé známé RDBMS jsou MySQL a PostgreSQL.
Binární datové typy SQL
Chcete-li uložit binární data (0
nebo 1
), použijete BINARY
a VARBINARY
typy dat. BINARY
datový typ ukládá binární data pevné délky, zatímco VARBINARY
ukládá binární data proměnné délky. Oba tyto datové typy se používají k ukládání řetězců bitů (0
's a 1
's). Jejich hodnoty jsou přiřazeny a načteny pomocí hexadecimální reprezentace, která je označena předponou 0x
. Sloupce (nebo proměnné) obou Binary
a VarBinary
datové typy se používají k ukládání obsahu obrazových souborů, jako jsou JPEG, BMP, soubory dokumentů atd.
Například pro desetinnou hodnotu 63
, jeho hexadecimální hodnota je reprezentována 0x3F
a jeho ekvivalent binárního bitového řetězce je 111111
. Chcete-li porozumět hodnotě těchto binárních řetězců a způsobu jejich uložení, zvažte následující příklad:
Poznámka Pokud není uvedeno jinak, všechny databázové příkazy uvedené v této příručce fungují dobře na obou MySQL a PostgreSQL .
-
Z příkazového řádku vytvořte tabulku s názvem
BinaryExample
jak je uvedeno níže:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) );
-
Vložte řádek do
BinaryExample
tabulka:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D);
-
Vyberte data z
BinaryExample
tabulka:SELECT BinaryCol, VarBinaryCol FROM BinaryExample;
Výstup vypadá následovně:
+------------------------+----------------------------+ | BinaryCol | VarBinaryCol | +------------------------+----------------------------+ | 0x4D7953514C0000000000 | 0x39274D | +------------------------+----------------------------+
Jak můžete vidět, BinaryCol
data jsou doplněna na maximální velikost sloupce s koncovými nulami, ale VarBinaryCol
datový sloupec není. Je to proto, že sloupce VarBinaryCol
jsou definovány jako proměnná délka.
Poznámka Maximální velikost (délka) datových typů Binary a VarBinary se liší v závislosti na implementaci databáze. Obecně jsou poměrně velké (přes 8 000 bajtů). Některé implementace databází mají binární rozšíření těchto základních datových typů, která mohou ukládat data o velikosti několika gigabajtů.
Číselné datové typy SQL
Dostupné číselné datové typy lze rozdělit do následujících skupin:celočíselné číselné datové typy, přesné číselné datové typy a přibližné číselné datové typy. Níže uvedené sekce pojednávají o každé skupině.
Celočíselné číselné datové typy
Celočíselné datové typy mohou být bez znaménka a se znaménkem. Nepodepsáno může ukládat pouze nula a kladná čísla, zatímco se znaménkem umožňuje nula, kladná a záporná čísla.
Většina implementací SQL podporuje datové typy Integer INT
, SMALLINT
a TINYINT
pro ukládání kladných a záporných celých čísel. Typ celočíselných čísel, který zvolíte, závisí na rozsahu hodnot, které potřebujete uložit.
Následující tabulka zobrazuje povolené úložiště v bajtech pro celočíselné číselné datové typy a jejich minimální a maximální hodnoty SIGNED.
Typ | Úložiště (bajty) | Minimální hodnota SIGNED | Maximální hodnota SIGNED |
---|---|---|---|
INT | 4 | minus 2^31 (-2147483648) | plus 2^31 (2147483647) |
SMALLINT | 2 | minus 2^15 (-32768) | plus 2^15 (32767) |
TINYINT | 1 | -128 | 127 |
Níže uvedený příklad ukazuje minimální a maximální hodnoty se znaménkem číselných datových typů typu Integer pomocí tabulky s názvem NumericExample
.
-
Z příkazového řádku vytvořte
NumericExample
tabulka.CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT );
-
Do
NumericExample
vložte následující hodnoty tabulka.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (3258594758, 32767, 255);
Když provedete výše uvedený příkaz, dostanete
Out of range
chyba, jak je znázorněno na výstupu níže. Nelze vložit hodnoty3258594758
a255
doIntColumn
aTinyIntColumn
resp. Důvodem je, že maximální hodnota SIGNED pro celočíselný datový typ je2147483647
a TinyInt je127
.ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
-
Aktualizujte hodnoty
IntColumn
aTinyIntColumn
sloupce a znovu spusťteINSERT
příkaz.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127);
-
Načtěte hodnoty sloupců pomocí
SELECT
prohlášení:SELECT IntColumn, SmallIntColumn, TinyIntColumn FROM NumericExample;
Výstup se podobá příkladu níže:
+------------+----------------+---------------+ | IntColumn | SmallIntColumn | TinyIntColumn | +------------+----------------+---------------+ | 2147483647 | 32767 | 127 | +------------+----------------+---------------+
Datové typy v desítkové soustavě (přesné číslo)
Desetinné datové typy, DECIMAL
a NUMERIC
, ukládat přesné a pevné číselné hodnoty. Tyto datové typy jsou také známé jako přesné číselné typy dat. Ukládají celočíselnou hodnotu nalevo od desetinné čárky a zlomkovou hodnotu napravo od desetinné čárky. Jsou funkčně ekvivalentní se stejnými požadavky na úložiště. Úložiště použité pro tyto typy závisí na specifikované přesnosti a rozsahu. Mohou se pohybovat od 2 bajtů do 17 bajtů a jejich hodnoty se mohou pohybovat od -10^38 +1
na +10^38 -1
.
Tyto dva datové typy jsou definovány přesností a měřítko . Přesnost udává počet míst nalevo a napravo od desetinné čárky dohromady, zatímco stupnice udává celkový počet číslic napravo od desetinné čárky. Tyto dva datové typy jsou vytvořeny pomocí následující syntaxe:
DECIMAL(precision, scale)
nebo
NUMERIC(precision,scale)
Níže uvedený příklad ukazuje, jak vytvořit a používat datový typ dekadického čísla.
-
Z příkazového řádku vytvořte
ExactNumericExample
tabulka.CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) );
-
Do
ExactNumericExample
vložte následující hodnoty tabulka.INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67);
-
Načtěte hodnoty sloupců pomocí
SELECT
prohlášení:SELECT DecimalCol, NumericCol FROM ExactNumericExample;
Výstup se podobá následujícímu:
+------------+------------+ | DecimalCol | NumericCol | +------------+------------+ | 123.45 | 12345.67 | +------------+------------+
Číselné datové typy s pohyblivou řádovou čárkou (přibližné numerické)
Číselné datové typy s pohyblivou řádovou čárkou jsou FLOAT
a REAL
. Nazývají se také přibližné číselné typy dat. Tyto datové typy ukládají přibližnou hodnotu díky binární reprezentaci dat s pohyblivou řádovou čárkou. Syntaxe pro vytvoření sloupce nebo proměnné s plovoucí desetinnou čárkou je následující:
Float(N)
Parametr N
označuje, zda má pole obsahovat čtyři nebo osm bajtů. Hodnota N
větší než sedm vyžaduje osm bajtů; sedm nebo méně vyžaduje čtyři bajty. Plovoucí přesnost pro tento datový typ se pohybuje od -1.79E + 308
na 1.79E + 308
.
Podobně sloupec a proměnná definované jako datový typ REAL
zabírá čtyři bajty úložiště a poskytuje rozsah hodnot od -3.40E + 38
na 3.40E + 38
.
Typy znakových dat SQL
Datové typy CHAR
a VARCHAR
se používají k ukládání znakových dat o délce až 8 000 bajtů. Oba tyto datové typy ukládají řetězcové hodnoty do databázových sloupců, liší se však tím, jak jsou jejich hodnoty uloženy a načteny. Délka CHAR
datový typ zůstává fixní na své zadané délce, ať už je tento alokační prostor využit nebo ne. Pokud není místo využito, sloupec nebo proměnná se doplní mezerami navíc. VARCHAR
vypíše hodnotu tak, jak je, bez dalších mezer.
Níže uvedený příklad ukazuje typ dat znaků.
-
Z příkazového řádku vytvořte
Employee
tabulka.CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) );
-
Do pole
Employee
vložte následující hodnoty tabulka.INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F');
-
Načtěte hodnoty sloupců pomocí
SELECT
prohlášení:SELECT LastName, FirstName, Sex FROM Employee;
Výstup by chtěl následující:
+----------+-----------+------+ | LastName | FirstName | Sex | +----------+-----------+------+ | Jones | Mary | F | +----------+-----------+------+
Sloupce LastName
a Firstname
jsou deklarovány jako typ Varchar
. To umožňuje, aby názvy byly tak dlouhé jako definice datového typu. U názvů kratších než zadané maximum se však k údajům v těchto sloupcích nepřipojují žádné mezery.
Typ dat data a času SQL
DATETIME
datový typ se používá k uložení hodnot data a času do databáze. Hodnoty pro DATETIME
datový typ používá čtyři bajty úložiště pro část data a čtyři bajty pro část času. Časová část tohoto datového typu určuje čas s přesností až na počet milisekund po půlnoci. Přesnost tohoto datového typu se pohybuje od „1. ledna 1753“ do „31. prosince 9999“ s přesností 3,33 milisekundy.
Poznámka Pokud k DATETIME
přiřadíte pouze hodnotu data datový typ sloupec nebo proměnná, časová část je výchozí půlnoc.
Níže uvedený příklad ukazuje DATETIME
datový typ.
DELIMITER //
CREATE PROCEDURE Datetimedemo()
BEGIN
DECLARE BirthDate DATETIME
SET BirthDate = '1990-01-01 09:00:00'
SELECT BirthDate
END//
DELIMITER ;
call Datetimedemo;
Výstup se podobá následujícímu:
+----------+-----------+
| BirthDate |
+----------+-----------+
| 1990-01-01 09:00:00 |
+----------+-----------+
Poznámka Některé implementace SQL podporují další datové typy, které jsou buď podmnožinou, nadmnožinou nebo variantou všech výše uvedených datových typů.
Úvahy o datových typech SQL
Při navrhování databáze je nesmírně důležité pečlivě vybrat vhodné datové typy pro sloupce tabulky a proměnné uložené procedury.
Provedené volby mohou mít významný dopad na efektivitu úložiště a celkový výkon databáze. Jednoduchým příkladem je definování Age
osoby aby byl sloupec Tinyint
datový typ, na rozdíl od Int
datový typ. Je to z následujících důvodů:
- Jak již bylo uvedeno dříve,
Tinyint
datové typy mají ¼ požadavků na úložištěInt
datové typy. - Efektivita vyhledávání
Tinyint
sloupec versusInt
sloupec je mnohem větší.
Na první pohled se to nemusí jevit jako velké znepokojení. Pokud však dotčená tabulka obsahuje miliony řádků, lze jistě dosáhnout efektivnosti úložiště i výkonu. Pokud tato kritéria návrhu rozšíříte na celou databázi, můžete dosáhnout této efektivity řádově.
Věnování potřebného času návrhu výběru datového typu databáze může potenciálně zmírnit potřebu provádět nákladné konverze typů v dotazech a logice uložených procedur při porovnávání sloupců různých datových typů.
Například v jedné tabulce uložíte datum do Varchar(20)
a v jiné tabulce uložíte datum do Datetime
sloupec. Pokud potřebujete porovnat dva sloupce, musíte v dotazu na jeden ze dvou sloupců použít funkci převodu datového typu. Toto je nákladná operace.
Závěr
Datové typy SQL jsou atributy spojené s databázovými sloupci a proměnnými. Tyto atributy mohou mít podobu binární, číselné, znakové a datum/čas. Pečlivý návrh je nutný, aby bylo zajištěno, že sloupce a proměnné jsou definovány se správným datovým typem, aby byla zajištěna efektivita ukládání i provádění dotazů.