sql >> Databáze >  >> RDS >> Mysql

Úvod do datových typů SQL

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 .
  1. 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)
     );
    
  2. Vložte řádek do BinaryExample tabulka:

     INSERT INTO BinaryExample (BinaryCol, VarBinaryCol)
     VALUES (0x4D7953514C, 0x39274D);
    
  3. 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 .

  1. Z příkazového řádku vytvořte NumericExample tabulka.

     CREATE TABLE NumericExample (
       IntColumn INT,
       SmallIntColumn SMALLINT,
       TinyIntColumn TINYINT
     );
    
  2. 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 hodnoty 3258594758 a 255 do IntColumn a TinyIntColumn resp. Důvodem je, že maximální hodnota SIGNED pro celočíselný datový typ je 2147483647 a TinyInt je 127 .

    ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
  3. Aktualizujte hodnoty IntColumn a TinyIntColumn sloupce a znovu spusťte INSERT příkaz.

     INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn)
     VALUES (2147483647, 32767, 127);
    
  4. 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.

  1. Z příkazového řádku vytvořte ExactNumericExample tabulka.

     CREATE TABLE ExactNumericExample (
       DecimalCol DECIMAL(5,2),
       NumericCol NUMERIC(7,2)
     );
    
  2. Do ExactNumericExample vložte následující hodnoty tabulka.

     INSERT INTO ExactNumericExample (DecimalCol, NumericCol)
     VALUES (123.45, 12345.67);
    
  3. 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ů.

  1. Z příkazového řádku vytvořte Employee tabulka.

     CREATE TABLE Employee (
         LastName VARCHAR(25),
         FirstName VARCHAR(20),
         Sex CHAR(1)
     );
    
  2. Do pole Employee vložte následující hodnoty tabulka.

     INSERT INTO Employee (LastName, FirstName, Sex)
     VALUES ('Jones', 'Mary', 'F');
    
  3. 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ů:

  1. Jak již bylo uvedeno dříve, Tinyint datové typy mají ¼ požadavků na úložiště Int datové typy.
  2. Efektivita vyhledávání Tinyint sloupec versus Int 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ů.


  1. Výkon operátora MySQL IN na (velkém?) počtu hodnot

  2. Jak funguje SYS_GUID() v MariaDB

  3. Načtěte řádek, který má pro sloupec maximální hodnotu

  4. Spuštění PostgreSQL pouze v paměti