Typy danych SQL Server / Transact-SQL – wprowadzenie
Dlaczego takie ważne jest wybranie właściwego typu danych dla naszych kolumn i zmiennych w MsSQL Server? Każda dana zarówno ta przechowywana w kolumnie tabeli, jak i zmienna w Transact-SQL posiada swój typ danych i zapisana jest w określony sposób. Wynika z tego m.in.:
- ile zajmuje miejsca w bazie,
- jakie wartości może przyjmować
- jak SQL Server będzie daną interpretował.
Daty zapisujemy w typach danych dat i czasu. Liczby zapisujemy w typach liczbowych. Tekst zapisujemy w typach danych przystosowanych do przechowywania tekstu. Przykładowo na liczbach zapisanych jako tekst nie możesz wykonywać działań arytmetycznych. W SQL Server wyróżniamy następujące grupy typów danych:
- Liczbowe
- Tekstowe
- Daty i czasu
- Binarne
- Pozostałe
W kolejnych rozdziałach opiszę wykorzystanie większości typów danych w Transact-SQL. W tym rozdziale przedstawiam najważniejsze typy danych, z których powinieneś korzystać.
Najważniejsze typy danych SQL Server / Transact-SQL
SQL Server oferuje nam kilkadziesiąt typów danych. Najważniejsze z nich do zapamiętania to: BIT, INT, BIGINT, FLOAT, CHAR, NCHAR, VARCHAR, NVARCHAR, DATETIME2, DATETIME, VARBINARY. To właśnie te typy danych powinieneś zapamiętać z kursu SQL Server. Opis tych typów zamieszczam poniżej:
Typ danych | Opis | Zakres | Zajmowana przestrzeń w bajtach (B) |
bit | Typ danych długiści jednego bita. Przechowuje wartość 1, 0 lub null. | 0, 1, null | 1B dla każdych 8 kolumn o tym typie w tabeli |
int | Typ do przechowywania dużych liczb całkowitych. | -2^31 (-2,147,483,648) do 2^31-1 (2,147,483,647) | 4B |
bigint | Typ do przechowywania bardzo dużych liczb całkowitych. | -2^63 (-9,223,372,036,854,775,808) do 2^63-1 (9,223,372,036,854,775,807) | 8B |
float [n] | Typ do przechowywania liczb zmiennoprzecinkowych o precyzji do 15 miejsc po przecinku. | – 1.79E+308 do -2.23E-308, 0 i 2.23E-308 do 1.79E+308 | 4B dla precyzji 7 miejsce po przecinku lub 8B dla precyzji 15 miejsc po przecinku. |
char [ ( n ) ] | Typ do przechowywania danych tekstowych o stałej długości znaków. | Do 8000 znaków. | do 8000B |
varchar[ ( n | max ) ] | Typ do przechowywania danych tekstowych o zmiennej długości znaków. | Do 8000 znaków. | Zadeklarowana długość lub 2B + 2^31-1 bytes (2 GB) dla deklaracji max. |
nchar [ ( n ) ] | Typ do przechowywania danych tekstowych o stałej długości znaków. Obsługuje UNICODE. | Do 4000 znaków. 1 znak to 2B | do 8000B |
nvarchar [ ( n | max ) ] | Typ do przechowywania danych tekstowych o zmiennej długości znaków. Obsługuje UNICODE. | Do 4000 znaków. 1 znak to 2B | Zadeklarowana długość x2 lub 2B + 2^31-1 bytes (2 GB) dla deklaracji max. |
datetime2 | Typ do przechowywania daty o elementach rok, miesiąc, dzień, godzina, minuta, sekunda, precyzja 100ns, strefa czasowa. | 0001-01-01 – 9999-12-31 23:59:59.9999999 | 6 B dla precyzji mniejszej niż 10ms; 7 B dla precyzji 1ms i 0,1ms. 8B dla wyższych precyzji. |
datetime | Typ do przechowywania daty o elementach rok, miesiąc, dzień, godzina, minuta, sekunda, precyzja 1ms. | 1753-01-01 – 9999-12-31 23:59:59.997 | 8B |
Przykład wykorzystania typów na danych z tabeli
Poniżej przykład tworzenia tabeli w SQL Server z głównymi typami danych. Po utworzeniu tabeli następuje INSERT przykładowych wartości do tabeli. Zwróć uwagę na to, że w przypadku typów binarnych najpierw konwertujemy dane na typ binarny. Możemy to zrobić za pomocą funkcji CAST lub CONVERT.
--tomaszkenig.pl CREATE TABLE tblDataTypes ( col_bit bit, col_int int, col_bigint bigint, col_float float, col_char char(10), col_varchar_1 varchar(255), col_varchar_2 varchar(max), col_nchar nchar(15), col_nvarchar_1 nvarchar(50), col_nvarchar_2 nvarchar(max), col_datetime datetime, col_datetime2 datetime2, col_varbinary_1 varbinary(2), col_varbinary_2 varbinary(max) ); go
Następnie do utworzonej tabeli możesz wprowadzić dane rzeczywiste
insert into tblDataTypes values
(1,123456,99999999999,12345.123456789123456, 'tekst 1', 'tekst 2', 'tekst 3', 'tekst 4', 'tekst 5','tekst 6', getdate(), '2019-01-01 21:59:12.1234567', cast('ab' as varbinary), cast('Kurs SQL Server zapis binarny' as varbinary));
go
select * from tblDataTypes;
go
Zmiana typów danych. Konwersja typów danych w SQL Server
W jaki sposób zmienić typ danych w SQL Server? Można to zrobić za pomocą dwóch funkcji: CONVERT lub CAST. Funkcja CAST jest używana także w bazach innych niż tworzonych w oparciu o SQL Server. Funkcja CONVERT poza samą zmianą typu umożliwia w niektórych przypadkach nadanie formatu danych wyjściowych. Pamiętaj, że przy konwersji typów danych, dane muszą być konwertowalne. Tzn. Nie przekowertujesz danych o typie tekstowym na liczbę. Jest natomiast możliwość wykonanina operacji odwrotnej, tzn. konwersja liczby na tekst.
Zmiana typu danych za pomocą funkcji CAST wykonywana jest za pomocą następującej składni:
CAST(wartość AS nowy_typ_danych)
Zmiana typu danych za pomocą funkcji CONVERT wykonywana jest za pomocą następującej składni:
CONVERT( nowy_typ_danych , wartość, [format])
Przykład zastosowania CAST i CONVERT poniżej:
use adventureworks go select a.ListPrice, CAST(a.ListPrice AS int) as ListPrice_int_cast, CONVERT(int, a.ListPrice) as ListPrice_int_conv, a.ModifiedDate, CAST(a.ModifiedDate AS DATE) as ModifiedDate_dt_cast, CONVERT(date, a.ModifiedDate, 20) as ModifiedDate_dt_conv from AdventureWorks.Production.Product a ;
Poniższe informacje to treści, do których możesz wrócić. Nie stanowią części kursu SQL Server. Traktuj te informacje jako coś, do czego możesz wrócić w celu uzupełnienia wiedzy. Nie próbuj nauczyć się ich na pamięć.
Lista wszystkich typów danych w SQL Server / Transact-SQL
Poniżej spis wszystkich typów danych wykorzystywanychh w bazach SQL Server wraz z opisem:
Przykład deklaracji zmiennych i typów danych w Transact-SQL
W nieco inny sposób wygląda pisanie podprogramów w Transact-SQL. Pisząc np procedurę składowaną lub funkcję, na początek powinniśmy zadeklarować zmienną o określonym typie danych. Następnie przypisujemy do zmiennej wartość, którą możemy już użyć w programie.
DECLARE @bitX bit = 1; DECLARE @intX int = 1233645; DECLARE @bigX bigint = 123456789; DECLARE @floX float = 12345.123456789123456; DECLARE @charX char(10) = 'tekst 1'; DECLARE @varX varchar(255) = 'tekst 2'; DECLARE @varX2 varchar(max) = 'tekst 3'; DECLARE @nchX2 nchar(15) = 'tekst 4'; DECLARE @nvaX1 nvarchar(50) = 'tekst 5'; DECLARE @nvaX2 nvarchar(max) = 'tekst 6'; DECLARE @dtmX datetime = getdate(); DECLARE @dtmX2 datetime2 = '2019-01-01 21:59:12.1234567'; DECLARE @vbX1 varbinary(2) = cast('ab' as varbinary); DECLARE @vbX2 varbinary(max) = cast('Kurs SQL Server zapis binarny' as varbinary); SELECT @bitX,@intX,@bigX,@floX,@charX,@varX,@varX2, @nchX2, @nvaX1, @nvaX2,@dtmX,@dtmX2,@vbX1,@vbX2 ;