Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wprowadzenie do typów danych SQL

Wybór odpowiedniego typu danych dla kolumny tabeli to ważna decyzja. Zmniejsza potrzebę konwersji typów danych, poprawia wydajność zapytań do bazy danych i minimalizuje wymagania dotyczące przechowywania.

W tym przewodniku zapoznasz się z różnymi typami danych, które są używane w systemach zarządzania relacyjnymi bazami danych (RDBMS). Te typy danych mogą być używane podczas tworzenia lub modyfikowania tabeli lub podczas deklarowania zmiennych w procedurach składowanych w bazie danych. Niektóre dobrze znane RDBMS to MySQL i PostgreSQL.

Binarne typy danych SQL

Aby przechowywać dane binarne (0 lub 1 ), używasz BINARY i VARBINARY typy danych. BINARY typ danych przechowuje dane binarne o stałej długości, podczas gdy VARBINARY przechowuje dane binarne o zmiennej długości. Oba te typy danych są używane do przechowywania ciągów bitów (0 i 1 's). Ich wartości są przypisywane i pobierane za pomocą reprezentacji szesnastkowej, która jest wskazywana przez prefiks 0x . Kolumny (lub zmienne) obu plików Binary i VarBinary typy danych służą do przechowywania zawartości plików graficznych, takich jak JPEG, BMP, pliki dokumentów itp.

Na przykład dla wartości dziesiętnej 63 , jego wartość szesnastkowa jest reprezentowana przez 0x3F a jego odpowiednik w postaci binarnego ciągu bitowego to 111111 . Aby zrozumieć wartość tych ciągów binarnych i sposób ich przechowywania, rozważ poniższy przykład:

Uwaga O ile nie wspomniano inaczej, wszystkie polecenia baz danych przedstawione w tym przewodniku działają dobrze zarówno na MySQL i PostgreSQL .
  1. Z wiersza poleceń utwórz tabelę o nazwie BinaryExample jak pokazano poniżej:

     CREATE TABLE BinaryExample (
       BinaryCol BINARY (10),
       VarBinaryCol VARBINARY (10)
     );
    
  2. Wstaw wiersz do BinaryExample tabela:

     INSERT INTO BinaryExample (BinaryCol, VarBinaryCol)
     VALUES (0x4D7953514C, 0x39274D);
    
  3. Wybierz dane z BinaryExample tabela:

     SELECT BinaryCol, VarBinaryCol FROM BinaryExample;
    

    Wynik wygląda następująco:

    +------------------------+----------------------------+
    | BinaryCol              | VarBinaryCol               |
    +------------------------+----------------------------+
    | 0x4D7953514C0000000000 | 0x39274D                   |
    +------------------------+----------------------------+

Jak widać, BinaryCol dane są dopełniane do maksymalnego rozmiaru kolumny z końcowymi zerami, ale VarBinaryCol kolumna danych nie jest. Dzieje się tak, ponieważ kolumny VarBinaryCol są zdefiniowane jako zmienna długość.

Uwaga Maksymalny rozmiar (długość) typów danych Binary i VarBinary różni się w zależności od implementacji bazy danych. Zazwyczaj są dość duże (ponad 8000 bajtów). Niektóre implementacje baz danych mają rozszerzenia binarne do tych podstawowych typów danych, które mogą przechowywać dane w rozmiarach wielu gigabajtów.

Numeryczne typy danych SQL

Dostępne typy danych Numeric można podzielić na następujące grupy:Typy danych liczbowych całkowitych, typy danych liczbowych Dokładne i typy danych liczbowych Przybliżone. Poniższe sekcje omawiają każdą grupę.

Całkowite numeryczne typy danych

Typy danych całkowitych mogą być bez znaku i ze znakiem. Niepodpisany może przechowywać tylko liczby zerowe i dodatnie, podczas gdy podpisany dopuszcza liczby zerowe, dodatnie i ujemne.

Większość implementacji SQL obsługuje typy danych Integer INT , SMALLINT i TINYINT do przechowywania liczb całkowitych dodatnich i ujemnych. Wybrany typ danych liczb całkowitych zależy od zakresu wartości, które należy przechowywać.

Poniższa tabela przedstawia dozwolone przechowywanie w bajtach dla liczbowych typów danych liczb całkowitych oraz ich minimalnych i maksymalnych wartości SIGNED.

Typ Pamięć (bajty) Minimalna wartość SIGNED Wartość maksymalna 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

Poniższy przykład demonstruje minimalne i maksymalne wartości ze znakiem liczbowych typów danych Integer przy użyciu tabeli o nazwie NumericExample .

  1. Z wiersza poleceń utwórz NumericExample tabela.

     CREATE TABLE NumericExample (
       IntColumn INT,
       SmallIntColumn SMALLINT,
       TinyIntColumn TINYINT
     );
    
  2. Wstaw następujące wartości do NumericExample tabela.

     INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn)
     VALUES (3258594758, 32767, 255);
    

    Kiedy wykonasz powyższe polecenie, otrzymasz Out of range błąd, jak pokazano na poniższym wyjściu. Nie możesz wstawić wartości 3258594758 i 255 do IntColumn i TinyIntColumn odpowiednio. Dzieje się tak, ponieważ maksymalna wartość SIGNED dla typu danych całkowitych to 2147483647 a TinyInt to 127 .

    ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
  3. Zaktualizuj wartości IntColumn i TinyIntColumn kolumn i ponownie uruchom INSERT polecenie.

     INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn)
     VALUES (2147483647, 32767, 127);
    
  4. Pobierz wartości kolumn za pomocą SELECT oświadczenie:

     SELECT IntColumn, SmallIntColumn, TinyIntColumn
     FROM NumericExample;
    

    Dane wyjściowe przypominają poniższy przykład:

    +------------+----------------+---------------+
    | IntColumn  | SmallIntColumn | TinyIntColumn |
    +------------+----------------+---------------+
    | 2147483647 |          32767 |           127 |
    +------------+----------------+---------------+

Typy danych w postaci liczb dziesiętnych (dokładna liczba)

Typy danych Decimal, DECIMAL i NUMERIC , przechowuj dokładne i stałe wartości liczbowe. Te typy danych są również znane jako dokładna liczba typy danych. Przechowują wartość całkowitą po lewej stronie przecinka dziesiętnego i wartość ułamkową po prawej stronie przecinka dziesiętnego. Są funkcjonalnie równoważne z tymi samymi wymaganiami dotyczącymi pamięci masowej. Pamięć używana dla tych typów zależy od określonej precyzji i zakresów. Mogą mieć zakres od 2 bajtów do 17 bajtów, a ich wartości mogą wynosić od -10^38 +1 do +10^38 -1 .

Te dwa typy danych są zdefiniowane przez precyzję i skala . Dokładność oznacza łączną liczbę miejsc po lewej i prawej stronie przecinka dziesiętnego, podczas gdy skala oznacza całkowitą liczbę cyfr po prawej stronie przecinka dziesiętnego. Te dwa typy danych są tworzone przy użyciu następującej składni:

DECIMAL(precision, scale)

lub

NUMERIC(precision,scale)

Poniższy przykład pokazuje, jak utworzyć i używać liczbowego typu danych dziesiętnych.

  1. Z wiersza poleceń utwórz ExactNumericExample tabela.

     CREATE TABLE ExactNumericExample (
       DecimalCol DECIMAL(5,2),
       NumericCol NUMERIC(7,2)
     );
    
  2. Wstaw następujące wartości do ExactNumericExample tabela.

     INSERT INTO ExactNumericExample (DecimalCol, NumericCol)
     VALUES (123.45, 12345.67);
    
  3. Pobierz wartości kolumn za pomocą SELECT oświadczenie:

     SELECT DecimalCol, NumericCol FROM ExactNumericExample;
    

    Dane wyjściowe są podobne do następujących:

    +------------+------------+
    | DecimalCol | NumericCol |
    +------------+------------+
    |     123.45 |   12345.67 |
    +------------+------------+

Liczbowe typy danych zmiennoprzecinkowych (liczba przybliżona)

Typy danych liczbowych zmiennoprzecinkowych to FLOAT i REAL . Są również nazywane liczbami przybliżonymi typy danych. Te typy danych przechowują przybliżoną wartość ze względu na binarną reprezentację danych zmiennoprzecinkowych. Składnia tworzenia kolumny lub zmiennej zmiennoprzecinkowej jest następująca:

Float(N)

Parametr N wskazuje, czy pole powinno zawierać cztery czy osiem bajtów. Wartość N większa niż siedem wymaga ośmiu bajtów; siedem lub mniej wymaga czterech bajtów. Dokładność zmiennoprzecinkowa dla tego typu danych wynosi od -1.79E + 308 do 1.79E + 308 .

Podobnie kolumna i zmienna zdefiniowane jako typ danych REAL zajmuje cztery bajty pamięci i zapewnia zakres wartości od -3.40E + 38 do 3.40E + 38 .

Typy danych znakowych SQL

Typy danych CHAR i VARCHAR służą do przechowywania danych znakowych o długości do 8000 bajtów. Oba te typy danych przechowują wartości ciągów w kolumnach bazy danych, ale różnią się sposobem przechowywania i pobierania ich wartości. Długość CHAR typ danych pozostaje stały na swojej określonej długości, niezależnie od tego, czy przestrzeń alokacji jest wykorzystywana, czy nie. Jeśli spacja nie jest wykorzystywana, kolumna lub zmienna jest dopełniana dodatkowymi spacjami. VARCHAR wypisuje wartość bez żadnych dodatkowych spacji.

Poniższy przykład demonstruje typ danych znakowych.

  1. Z wiersza poleceń utwórz Employee tabela.

     CREATE TABLE Employee (
         LastName VARCHAR(25),
         FirstName VARCHAR(20),
         Sex CHAR(1)
     );
    
  2. Wstaw następujące wartości w Employee tabela.

     INSERT INTO Employee (LastName, FirstName, Sex)
     VALUES ('Jones', 'Mary', 'F');
    
  3. Pobierz wartości kolumn za pomocą SELECT oświadczenie:

     SELECT LastName, FirstName, Sex FROM Employee;
    

    Dane wyjściowe powinny wyglądać następująco:

    +----------+-----------+------+
    | LastName | FirstName | Sex  |
    +----------+-----------+------+
    | Jones    | Mary      | F    |
    +----------+-----------+------+

Kolumny LastName i Firstname mają zadeklarowany typ Varchar . Dzięki temu nazwy mogą być tak długie, jak definicja typu danych. Ale w przypadku nazw krótszych niż określone maksimum, do danych w tych kolumnach nie są dołączane spacje.

Typ danych SQL Data i godzina

DATETIME typ danych służy do przechowywania wartości daty i godziny w bazie danych. Wartości dla DATETIME typ danych wykorzystuje cztery bajty pamięci na część daty i cztery bajty na część czasu. Część czasowa tego typu danych określa czas z dokładnością do liczby milisekund po północy. Dokładność dla tego typu danych waha się od „1 stycznia 1753” do „31 grudnia 9999” z dokładnością do 3,33 milisekundy.

Uwaga Jeśli przypiszesz tylko wartość daty do DATETIME kolumna lub zmienna typu danych, domyślna część czasu to północ.

Poniższy przykład demonstruje DATETIME typ danych.

DELIMITER //
CREATE PROCEDURE Datetimedemo()
BEGIN
DECLARE BirthDate DATETIME
SET BirthDate = '1990-01-01 09:00:00'
SELECT BirthDate
END//
DELIMITER ;
call Datetimedemo;

Dane wyjściowe są podobne do następujących:

+----------+-----------+
| BirthDate            |
+----------+-----------+
| 1990-01-01 09:00:00  |
+----------+-----------+
Uwaga Niektóre implementacje SQL obsługują dodatkowe typy danych, które są albo podzbiorem, nadzbiorem, albo wariantem wszystkich wyżej określonych typów danych.

Zagadnienia dotyczące typów danych SQL

Podczas projektowania bazy danych niezwykle ważne jest, aby starannie wybrać odpowiednie typy danych dla kolumn tabeli i zmiennych procedur składowanych.

Dokonane wybory mogą mieć znaczący wpływ na wydajność pamięci masowej i ogólną wydajność bazy danych. Prostym przykładem jest zdefiniowanie Age osoby kolumna do Tinyint typ danych, w przeciwieństwie do Int typ danych. Dzieje się tak z następujących powodów:

  1. Jak wspomniano wcześniej, Tinyint typy danych mają ¼ wymagań dotyczących przechowywania Int typy danych.
  2. Wydajność wyszukiwania Tinyint kolumna a Int kolumna jest znacznie większa.

Na pierwszy rzut oka może się to nie wydawać dużym problemem. Jeśli jednak tabela, której dotyczy problem, zawiera miliony wierszy, z pewnością można osiągnąć zarówno wydajność pamięci masowej, jak i wydajności. Jeśli rozszerzysz te kryteria projektowe na całą bazę danych, możesz wygenerować te wydajności o rzędy wielkości.

Poświęcenie niezbędnego czasu projektowania na wybór typu danych bazy danych może potencjalnie zmniejszyć potrzebę wykonywania kosztownych konwersji typów w zapytaniach i logice procedur składowanych podczas porównywania kolumn różnych typów danych.

Na przykład w jednej tabeli przechowujesz datę w Varchar(20) kolumna, a w innej tabeli przechowujesz datę w Datetime kolumna. Jeśli chcesz porównać dwie kolumny, musisz użyć funkcji konwersji typu danych w zapytaniu dotyczącym jednej z dwóch kolumn. To kosztowna operacja.

Wniosek

Typy danych SQL to atrybuty powiązane z kolumnami i zmiennymi bazy danych. Atrybuty te mogą mieć postać binarną, numeryczną, znakową i datą/godziną. Konieczny jest ostrożny czas projektowania, aby upewnić się, że kolumny i zmienne są zdefiniowane z prawidłowym typem danych, aby zapewnić wydajność zarówno przechowywania, jak i wykonywania zapytań.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie MySQL — rekordy od dnia dzisiejszego do ostatnich 30 dni

  2. Błąd MySQL 1449:Użytkownik określony jako definiujący nie istnieje

  3. Jak przyznać wszystkie uprawnienia w bazie danych w MySQL?

  4. Jak działa funkcja OCTET_LENGTH() w MySQL

  5. Dlaczego kolumna tekstowa nie może mieć wartości domyślnej w MySQL?