Wykład 3. Typy danych używane przez serwery baz danych dla języka SQL

Wykład II poświęcony jest prezentacji i omówieniu używanym w języku SQL typom zmiennych, z uwzględnieniem różnic implementacyjnych pomiędzy MS SQL Server i ORACLE.

Standard języka SQL przewiduje (ogólnie) typy:

Poszczególne implementacje realizują wytyczne standardu, niemniej każda stosuje własny sposób tej realizacji. Poniżej przedstawiamy typy danych dla MS SQL Server 2008 R2 oraz ORACLE 11g. Należy zwrócić uwagę na fakt, że w MS SQL Server 2008 wprowadzono szereg zmian (nie tylko w typach danych) w stosunku do wersji 2000 i 2005, niekiedy znaczących. Nie będą omawiane typy znacząco rozszerzające standard, lecz nieistotne dla dalszej treści wykładów z przedmiotu KBD (np. BLOB, ROWID), a także inne, nieużywane na podstawowym poziomie typy zmiennych. Zainteresowanych rozszerzeniem zagadnienia odsyłamy do dokumentacji producentów oprogramowania (MSDN dla MS SQL).

Typy napisowe niedopuszczające zapisu znaków UNICODE

CHARACTER(n), CHAR(n) – napis o stałej długości, max n bajtów (zapis 1 znak/bajt;). Każdy napis o długości mniejszej niż n znaków uzupełniany jest spacjami zadeklarowanej wielkości n.

MS SQL

1 < n < =8000

ORACLE

1 < n < = 2000

VARCHAR(n) – napis o maksymalnej długości n bajtów (znaków), nieuzupełniany spacjami. Pozostałe własności jak CHAR.

MS SQL

1 <= n < =8000

Dodatkowo VARCHAR (max) o maksymalnej długości 2^31-1 bajtów.

ORACLE

VARCHAR2(n) 1 <= n < =4000

Typy napisowe wykorzystujące znaki UNICODE

nCHAR(n), nVARCHAR(n)

MS SQL

1 <= n < =4000 (znaków, 2 bajty na znak)

VARCHAR(max) 2^31-1 bajtów (liczba znaków dwukrotnie mniejsza)

Dodatkowo VARCHAR (max) o maksymalnej długości 2^31-1 bajtów.

ORACLE

Tak jak dla CHAR i VARCHAR2.

Typy liczbowe

MS SQL

INTEGER, INT – liczba całkowita ze znakiem; zakres -2^31 do 2^31 – 1; zapis 4 bajty

BIGINT – liczba całkowita ze znakiem; zakres -2^63 do 2^63 – 1; zapis 8 bajtów

SMALLINT – liczba całkowita ze znakiem; zakres -2^15 do 2^15 – 1; zapis 2 bajty

TINYINT – liczba całkowita; zakres 0 do 250; zapis 1 bajt

BIT – liczba całkowita przyjmująca wartości 0, 1, NULL

DECIMAL(p,s) i NUMERIC(p,s) – liczby zmiennoprzecinkowe, gdzie p określa maksymalną liczbę zapamiętywanych cyfr, s określa maksymalną liczbę cyfr na prawo od separatora dziesiętnego. Zakres 1 <= p <= 38, 1 <= s <= p. Wartościami domyślnymi są p = 18, s = 0. Przedział wielkości możliwych do zapisania to -10^38 do 10^38 – 1. Liczba wykorzystywanych do zapisu bajtów zależna jest od zadeklarowanej wartości p i zmienia się w przedziale od 5 do 17.

MONEY – typ zmiennoprzecinkowy przeznaczony do zapisu wielkości walutowych. Formatowany z czterema miejscami po separatorze dziesiętnym, z przecinkami oddzielającymi trzycyfrowe grupy. Zakres -922,337,203,685,477.5808 do 922,337,203,685,477.5807. Wykorzystuje do zapisu 8 bajtów.

SMALLMONEY – tak jak MONEY. Zakres - 214,748.3648 do 214,748.3647. Wykorzystuje do zapisu 4 bajty.

ORACLE

Wszystkie liczby są zapisywane jako NUMBER(p,s). Zakres 1 <= p <= 38, -84 <= s <= 127. Wartości ujemne s oznaczają zaokrąglenie s cyfr na lewo od separatora dziesiętnego. Np. liczba 7,456,123.89 zapisana jako NUMBER(7, -2) zostanie wyświetlona, jako 7456100.

Liczby stałoprzecinkowe zapisywane są jako NUMBER lub NUMBER(p). Akceptowana jest deklaracja typu INTEGER, traktowana jako synonim NUMBER(38).

Typy daty i czasu.

MS SQL

DATETIME – zapisuje kombinację daty i czasu, z dokładnością do 1 milisekundy, w oparciu o kalendarz Gregoriański i zegar 24 – ro godzinny. Zakres kodowanych wartości od 1 stycznia 1753, do 31 grudnia 9999. Typ niezalecany począwszy od wersji MS SQL 2008. W nowych rozwiązaniach powinien zostać zastąpiony typami DATE, TIME i DATIME2.

DATIME2 stanowi kombinację typów DATE i TIME. Typ wprowadzony w wersji MS SQL 2008.

DATE – zapisuje datę z dokładnością do jednego dnia. Zakres kodowanych wartości od 1 stycznia 0001, do 31 grudnia 9999. Wartość domyślna to 1 stycznia 1900. Sposób zapisu jak dla DATETIME. Typ wprowadzony w wersji MS SQL 2008.

TIME(s) – zapisuje czas, bazując na zegarze 24 – ro godzinnym, z dokładnością do 1/10^s części sekundy. 0 <= s <= 7. Maksymalna (a także domyślna) wartość s = 7 odpowiada dokładności 100 ns. Typ wprowadzony w wersji MS SQL 2008.

Dla wszystkich typów daty i czasu, wartości zapisywane są i zwracane w postaci napisu (stringu), o formacie zgodnym z ustawieniami serwera bazy danych.

ORACLE

DATE – zapisuje datę z dokładnością do jednego dnia. Zakres kodowanych wartości 1 stycznia 4712 BC do 31 grudnia 9999 AD.

TIMESTAMP(s) - zapisuje datę z dokładnością do 1/10^s części sekundy. 0 <= s <= 9. Zakres kodowanych wartości 1 stycznia 4712 BC do 31 grudnia 9999 AD.