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
BinaryExamplejak je uvedeno níže:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) ); -
Vložte řádek do
BinaryExampletabulka:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D); -
Vyberte data z
BinaryExampletabulka: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
NumericExampletabulka.CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT ); -
Do
NumericExamplevlož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 rangechyba, jak je znázorněno na výstupu níže. Nelze vložit hodnoty3258594758a255doIntColumnaTinyIntColumnresp. Důvodem je, že maximální hodnota SIGNED pro celočíselný datový typ je2147483647a TinyInt je127.ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1 -
Aktualizujte hodnoty
IntColumnaTinyIntColumnsloupce a znovu spusťteINSERTpříkaz.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127); -
Načtěte hodnoty sloupců pomocí
SELECTprohláš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
ExactNumericExampletabulka.CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) ); -
Do
ExactNumericExamplevložte následující hodnoty tabulka.INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67); -
Načtěte hodnoty sloupců pomocí
SELECTprohláš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
Employeetabulka.CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) ); -
Do pole
Employeevložte následující hodnoty tabulka.INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F'); -
Načtěte hodnoty sloupců pomocí
SELECTprohláš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,
Tinyintdatové typy mají ¼ požadavků na úložištěIntdatové typy. - Efektivita vyhledávání
Tinyintsloupec versusIntsloupec 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ů.