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 .
-
Z wiersza poleceń utwórz tabelę o nazwie
BinaryExample
jak pokazano poniżej:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) );
-
Wstaw wiersz do
BinaryExample
tabela:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D);
-
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
.
-
Z wiersza poleceń utwórz
NumericExample
tabela.CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT );
-
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ści3258594758
i255
doIntColumn
iTinyIntColumn
odpowiednio. Dzieje się tak, ponieważ maksymalna wartość SIGNED dla typu danych całkowitych to2147483647
a TinyInt to127
.ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
-
Zaktualizuj wartości
IntColumn
iTinyIntColumn
kolumn i ponownie uruchomINSERT
polecenie.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127);
-
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.
-
Z wiersza poleceń utwórz
ExactNumericExample
tabela.CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) );
-
Wstaw następujące wartości do
ExactNumericExample
tabela.INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67);
-
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.
-
Z wiersza poleceń utwórz
Employee
tabela.CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) );
-
Wstaw następujące wartości w
Employee
tabela.INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F');
-
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:
- Jak wspomniano wcześniej,
Tinyint
typy danych mają ¼ wymagań dotyczących przechowywaniaInt
typy danych. - Wydajność wyszukiwania
Tinyint
kolumna aInt
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ń.