T-SQL verilənlər tipləri, onların PL/SQL – də olan analoqu və ANSİ SQL standartına uyğunluğu – 1-ci hissə.
Salam Dostlar.
Bugünkü dərsimizdə cədvəllərin yaradılması zamanı ən vacib işlərdən biri olan verilənlər tiplərinin təyin olunması qaydaları ilə tanış olacağıq.
Keçən dərslərimizdən öyrəndiniz ki, verilənlər bazasında bütün verilənlər mürəkkəb çoxluqlar şəklində saxlanılır. Həmin çoxluqlar (və ya münasibətlər) verilənlər bazasının cədvəllərini, çoxluqların elementləri (və ya münasibətin kortejləri) – cədvəllərin sətirlərini, elementlərin atributları – cədvəllərin sütunlarını təşkil edir. Keçən dərslərimizdən bizə tanış olan kadrlar uçotu aparılacaq “kadrlar” bazasına nəzər yetirsək, görərik ki, baza bir neçə cədvəldən ibarətdir. Hər bir cədvəl ayrı-ayrı çoxluğu özündə əks etdirir: departamentlər çoxluğu, əməkdaşlar çoxluğu, əmək haqqı çoxluğu, telefon nömrələri çoxluğu. Hər bir cədvəlin də bir neçə sütunu vardır, başqa sözlə, çoxluğa daxil olan hər bir elementin bir neçə atributu vardır. Atributlarda və ya sütunlarda elementlərin parametrləri yerləşir, məsələn: əməkdaşların adı, soyadı, ünvanı, əmək haqqı, telefon nömrəsi, işlədiyi departament və s. Ad, soyad, ünvan, departamentin adı sözlərdən ibarətdir buna görə də həmin sütunlarda verilənlər adətən sətir tipində saxlanılır, telefon nömrələri, əmək haqqı, audentifikasiya nömrəsi isə adətən ədədlər tipində saxlanılır. Bu tiplərin seçilməsi zamanı əsas meyar məntiqdir, çünki, məsələn: soyad və digər mətnlər üçün ədəd tipinin və əksinə telefon nömrələri, audentifikasiya kodu üçün sətir tipinin seçilməsi məntiqsizdir. Hər bir sütunun tiplərinin təyin olunması verilənlərin bütövlülüyünün təminatıdır. Sütunun tipi olmasaydı istənilən məlumatı ora daxil etmək olardı, məsələn: sətir, ədəd, pul və s. Belə olan halda verilənlərin daxil edilməsi və sorğusu çətinləşər və ya heç mümkün olmazdı. Beləliklə, verilənlər tiplərini təyin etməklə cədvələ daxil edilən məlumatlara məhdudiyyət qoyulur.
Münasibətli verilənlər bazasında saxlanılan verilənlərin bütün qiymətləri tipləşdirilmişdir, yəni hər saxlanılan qiymətin tipi məlumdur. Münasibətli verilənlər bazasında “verilənlərin tipləri” anlayışı proqramlaşdırma dillərində olan “verilənlərin tipləri” anlayışına tamamilə uyğundur.
Qeyd etmək lazımdır ki, SQL standartlarında verilənlər tipləri müəyyənləşdirilib. Lakin ayrı-ayrı platformalarda verilənlər tiplərinə müxtəlif yanaşmalar vardır. Əksər tiplər standarta uyğun olsa da, platformada istifadə olunan tiplər bəzən başqa cür adlandırılır. məsələn: Oracle VBİS – də istifadə olunan NUMBER tipi standartda mövcud deyildir və standartda onun sinonimi – NUMERIC istifadə olunur. Bəzən eyni adlı tiplər ayrı-ayrı platformalarda müxtəlif cür istifadə olunur. Bir şeyin müqayisə edərək öyrənilməsi daha maraqlı və səmərəli olur, buna görə də Microsoft SQL Server verilənlər tiplərinin izahı zamanı, onları Oracle Database serverdə istifadə olunan tiplərlə müqayisə etmək qərarına gəldim. Mövzu geniş olduğu üçün məqalə bir neçə hissəyə bölünüb.
Digər məsələ ondan ibarətdir ki, çox vaxt Microsoft SQL Serverdə istifadə olunan verilənlər bazasını Oracle Database serverinə və əksinə keçirmək (miqrasiya etmək) lazım olur. Həmin verilənlər bazalarının keçirilməsi (miqrasiyası) SQL dialektlərində olan fərqlərə görə çətinləşir. Bu zaman müxtəlif vasitələr (SQL Server Migration Assistant, Oracle Migration Workbench və s.) axtarılır. Lakin T-SQL kodunu PL/SQL koduna tam problemsiz çevirən sehrli bir “tool” və mexanizm mövcud deyil. Əksər hallarda kod yenidən əl ilə yazılmalıdır. Ən əsas problem verilənlərin tipləri ilə yaranır. Bu səbəbdən bəzi VBİS-lərdə cədvəl yaradılan zaman ANSİ SQL standartında istifadə olunan müəyyən verilənlər tiplərinin sinonimlərinin istifadəsi nəzərdə tutulmuşdur. Məsələn: Oracle Database-də “ANSİ, DB2, and SQL/DS Datatypes” adlı xüsusi kateqoriya vardır. Microsoft SQL Serverə ANSİ (İSO) SQL standartında uyğunlaşmaq üçün verilənlər tiplərinin sinonimləri “Data Type Synonyms (Transact-SQL)” istifadə olunur. Bu sinonimləri cədvəl yaradılan zaman istifadə etmək olar. VBİS avtomatik olaraq həmin sinonimləri SQL Serverdə istifadə olunan tiplərə çevirir və bu tiplərdə saxlayır.
Düzəltdiyim aşağıdakı cədvəldə Transact-SQL verilənlər tipləri, onların PL/SQL – də olan analoqu və ANSİ SQL standartına uyğunluğu göstərilib:
ANSİ SQL |
MS SQL Server |
Oracle Database |
Tam ədədlər (Exact numerics) |
||
BIGINT | BIGINT | NUMBER(19) |
INTEGER | INT | NUMBER(10) |
SMALLINT | SMALLINT | NUMBER(5) |
Dəstəkləmir | TINYINT | NUMBER(3) |
DECIMAL | DECIMAL(p,s) | NUMBER(p,s) |
NUMERIC | NUMERIC(p,s) | NUMBER(p,s) |
Dəstəkləmir | BIT | NUMBER(3) |
Dəstəkləmir | MONEY | NUMBER(19,4) |
Dəstəkləmir | SMALLMONEY | NUMBER(10,4) |
Təxmini ədədlər ( Approximate numerics) |
||
REAL | REAL | FLOAT(23) |
DOUBLE PRECISION | FLOAT | FLOAT(49) |
DOUBLE PRECISION | FLOAT([1-53]) | FLOAT([1-53]) |
REAL | FLOAT(24) | BINARY_FLOAT |
DOUBLE PRECISION | FLOAT(53) | BINARY_DOUBLE |
Tarix və zaman (Date and time) |
||
DATE | DATE | DATE |
TIMESTAMP | DATETIME | TIMESTAMP(3) və ya DATE |
TIMESTAMP WITH TIMEZONE | DATETIME2 | TIMESTAMP |
TIMESTAMP | DATETIMEOFFSET | TIMESTAMP WITH TIMEZONE |
Dəstəkləmir | SMALLDATETIME | TIMESTAMP(3) və ya DATE |
TIME | TIME | TIMESTAMP |
Dəstəkləmir | VARCHAR(37) | TIMESTAMP WITH TIMEZONE |
Dəstəkləmir | Dəstəkləmir | INTERVAL YEAR TO MONTH |
Dəstəkləmir | Dəstəkləmir | INTERVAL DAY TO SECOND |
Simvolik sətirlər (Character strings) |
||
CHARACTER | CHAR | CHAR |
CHARACTER VARYING | VARCHAR | VARCHAR2 |
Dəstəkləmir | TEXT | LONG |
CHARACTER VARYING | VARCHAR(max) | CLOB |
Yunikod simvolik sətirlər (Unicode character strings) |
||
NATIONAL CHARACTER | NCHAR | NCHAR |
NATIONAL CHARACTER VARYING | NVARCHAR | NVARCHAR2 |
NATIONAL CHARACTER VARYING | NVARCHAR(max) | NCLOB |
Dəstəkləmir | NTEXT | LONG |
İkili sətirlər (Binary strings) |
||
BLOB | BINARY | RAW |
BLOB | VARBINARY | LONG RAW |
BLOB | VARBINARY(MAX) | BLOB, BFILE or LONG RAW |
Dəstəkləmir | IMAGE | LONG RAW |
Digər verilənlər tipləri (Other data types) |
||
TIMESTAMP | TIMESTAMP | RAW |
XML | XML | XMLTYPE |
Dəstəkləmir | UNIQUEIDENTIFIER | RAW(16) |
Dəstəkləmir | CURSOR | Dəstəkləmir |
Dəstəkləmir | HIERARCHYID | Dəstəkləmir, CONNECT BY əmri ilə əvəz olunur |
Dəstəkləmir | SQL_VARIANT | Dəstəkləmir |
Dəstəkləmir | TABLE | Dəstəkləmir |
Dəstəkləmir | GEOGRAPHY | Dəstəkləmir |
Dəstəkləmir | GEOMETRY | SDO_GEOMETRY |
Microsoft SQL Server 2014 verilənlər tiplərinin aşağıdakı kateqoriyaları vardır:
- Tam ədədlər (Exact numerics):
BIGINT, INT, SMALLINT, TINYINT, DECIMAL, NUMERIC, MONEY, SMALLMONEY, BIT
- Təxmini ədədlər (Approximate numerics):
FLOAT, REAL
- Tarix və zaman (Date and time):
DATE, DATETIME2, DATETIME, DATETIMEOFFSET, SMALLDATETIME, TIME
- Simvolik sətirlər (Character strings):
CHAR, TEXT, VARCHAR
- Yunikod simvolik sətirlər (Unicode character strings):
NCHAR, NTEXT, NVARCHAR
- İkili məlumatlar (Binary strings):
BINARY, IMAGE, VARBINARY
- Digər verilənlər tipləri (Other data types):
CURSOR, TIMESTAMP, XML, HIYERARCHYID, SQL_VARIANT, TABLE, UNIQUEIDENTIFIER, SPATIAL TYPES
İndi isə verilənlər tiplərinin hər biri ilə yaxından tanış olaq:
Tam ədədlər (Exact numerics) verilənlər tipləri kateqoriyasına tam ədədlər, dəqiqliyi və miqyası təyin olunmuş onluq kəsr ədədlər və pul (valyuta) tipləri daxildir:
TAM ƏDƏDLƏR TİPLƏRİ:
Verilənlər tipləri | Dəstəklədiyi diapazon | Yaddaşda tutduğu yer |
bigint | -2^63 (-9 223 372 036 854 775 808) dən 2^63-1 (9 223 372 036 854 775 807) dək | 8 bayt |
int | –2^31 dən (–2 147 483 648) dən 2^31-1 (2 147 483 647) dək | 4 bayt |
smallint | -2^15 (-32 768) dən 2^15-1 (32 767) dək | 2 bayt |
tinyint | 0 dan 255 dək | 1 bayt |
INT tipi SQL Serverdə tam ədədlərin əsas tipidir. BIGINT tipi INT tipi dəstəklədiyi diapazonunu aşan ədədlərin saxlanılması üçün istifadə olunur. Məsələn: INT tipi maksimal olaraq 2147483647 rəqəmini dəstəkləyir. 2147483648 qiymətində olan verilənləri saxlamaq üçün artıq BIGINT verilənlər tipi seçilməlidir. Sütunda saxlanılacaq qiymət 32767 qiymətini aşmayacaqsa SMALLINT tipi seçilir. Lakin saxlanılacaq qiymət 32767 rəqəmini aşacaqsa, məsələn 32768 olacaqsa və qiymətin həmin həddi aşıb aşmayacağını dəqiq bilmiriksə INT tipi seçilməlidir. Lakin qiymətin həddi aşmayacağı dəqiq məlumdursa, daha aşağı səviyyəli tipin seçilməsi məsləhət olunur, çünki bu tipdə verilənlər yaddaşda daha az yer tutur və verilənlər bazasının həcminə təsir edir. Ümumiyyətlə belə hədlərin qoyulması verilənlərin yaddaşda tutduğu yerə görə və verilənlər bazasının həcminə daha səmərəli şəkildə nəzarət etmək üçün tətbiq edilib. Məsələn, sütunda saxlanılacaq qiymətin 255 qiymətini aşmayacağını dəqiq biliriksə, TINYINT tipini seçsək, bu tipdə saxlanılan verilənlərin hər biri yaddaşda cəmi 1 bayt tutacaq. Lakin, sütunda saxlanılacaq həmin həddi aşmayacağını bilərək BIGINT tipini seçsək, bu tipdə saxlanılan verilənlərin hər biri yaddaşda 8 bayt, INT tipini seçsək – hər biri 4 bayt tutacaq. Nəzərə alsaq ki verilənlərin sayı minlərlə, hətta yüz minlərlə ola bilər bu zaman düzgün seçimin nə qədər vacib olduğunu anlayarıq.
Oracle Batabase – də ədədlərin saxlanılması üçün NUMBER tipi istifadə edilir. Lakin diqqət etsək görərik ki, BIGINT tipi 19 rəqəmli ədədi (9223372036854775807), İNT tipi 10 rəqəmli ədədi (2147483647), SMALLINT tipi 5 rəqəmli ədədi (32767), TİNYİNT tipi 3 rəqəmli ədədi (255) dəstəkləyir. Oracle Batabase – də bu tip NUMBER (p, s) şəklində yazılır. Burada p – ədədin dəqiqliyi (precision), s – miqyası (scale) anlamındadır. Məsələn: NUMBER (19) tipində maksimal olaraq 19 rəqəmli tam ədədlər saxlanıla bilər, NUMBER (10, 4) tipində maksimal olaraq 10 rəqəmdən və vergüldən sonra maksimal olaraq 4 rəqəmdən ibarət olan onluq kəsr ədədlər saxlanıla bilər. Buna uyğun olaraq Microsoft SQL Server – də olan INT, BIGINT, SMALLINT və ya TINYINT verilənlər tiplərinin hər biri üçün Oracle Batabase – də olan NUMBER tipi təyin etmək olar. Beləliklə, BIGINT tipinin analoqu NUMBER(19), INT tipinin analoqu NUMBER(10), SMALLINT tipinin analoqu NUMBER(5) və TINYINT tipinin analoqu NUMBER(3) tipləridir.
ANSİ SQL standartı tərəfindən BIGINT və SMALLINT verilənlər tipləri dəstəklənir, TINYINT tipi dəstəklənmir, INT tipinin analoqu isə INTEGER tipidir. Qeyd etmək lazımdır ki, Microsoft SQL Serverdə INT tipini INTEGER şəklində də yazmaq olar. “ANSİ, DB2, and SQL/DS Datatypes” uyğun olaraq Oracle Database – də cədvəl yaradılan zaman INT, INTEGER və SMALLINT tiplərini istifadə etmək olar, lakin Oracle VBİS tərəfindən həmin tiplər avtomatik olaraq NUMBER(38) tipinə çevrilir və verilənlər bu tipdə saxlanılır. Bu VBİS-də cədvəl yaradılan zaman sütunun tipini BIGINT və ya TINYINT təyin etsək, VBİS bu tipləri dəstəkləmədiyi barədə səhv mesajı verəcək.
Nümunə:
Aşağıdakı nümunədə test bazasında INT, BIGINT, SMALLINT və TINYINT tiplərinin istifadə edən cədvəl yaradılır. Hər bir sütuna maksimal dəstəkləyən verilənlər daxil edilir və sonda həmin cədvələ sorğu verilir:
CREATE DATABASE test;
GO
CREATE TABLE dbo.Cedvel
(
BigIntSutunu bigint
,IntSutunu int
,SmallIntSutunu smallint
,TinyIntSutunu tinyint
);
GO
INSERT INTO dbo.Cedvel VALUES (9223372036854775807, 2147483647, 32767, 255);
GO
SELECT BigIntSutunu, IntSutunu, SmallIntSutunu, TinyIntSutunu
FROM dbo.Cedvel;
GO
Nəticədə alırıq:
BigIntSutunu |
IntSutunu | SmallIntSutunu |
TinyIntSutunu |
9223372036854775807 |
2147483647 |
32767 |
255 |
(1 row(s) affected) |
DƏQIQLIYI VƏ MIQYASI TƏYIN OLUNMUŞ ONLUQ KƏSR ƏDƏDLƏR TIPLƏRI:
Bu kateqoriyaya DECIMAL və NUMERIC tipləri daxildir. Microsoft SQL Server – də bu tiplər eynidir, yəni tiplərin adları fərqlidir, lakin funksionallıqları eynidir. DECIMAL tipi üçün DEC sinonimi mövcuddur. Həmin tiplərdə onluq kəsr ədədlər saxlanıla bilər. Həmin kəsrlər ədədlərin dəqiqliyi və miqyası təyin olunur. Yazılış sintaksisi:
decimal [ (p[ ,s] )]
numeric[ (p[ ,s] )]
Burada p – ədədin dəqiqliyi (precision), s – miqyası (scale) anlamındadır. Məsələn: DECİMAL(10,4) tipində maksimal olaraq 10 rəqəmdən və vergüldən sonra maksimal olaraq 4 rəqəmdən ibarət olan onluq kəsr ədədlər saxlanıla bilər. Bu zaman vergüldən qabaq olan rəqəmlərin sayı p – s qydasında hesablanır. Yəni DECİMAL(10,4) tipində vergüldən qabaq yalnız 6 rəqəm yazıla bilər.
Dəqiqliyi və miqyası təyin etməmək olar, bu zaman ilkin təyinetmə (default) dəqiqlik və miqyas təyin ediləcək. Dəqiqlik 1-38 diapazonunda təyin etmək olar. Dəqiqlik təyin edilməyibsə, ilkin olaraq dəqiqlik 18 qiymətində təyin olunur. Miqyası sıfırdan dəqiqliyin qiymətinə qədər təyin etmək olar. Miqyas təyin edilməyibsə, ilkin olaraq sıfır qiyməti təyin olunur. Dəqiqliyi miqyassız təyin etmək olar, lakin təkcə miqyası dəqiqliksiz təyin etmək olmur. Məsələn:
DECİMAL və DECİMAL (18,0) tipləri eynidir. Əgər DECİMAL (19) təyin olunubsa, bu DECİMAL (19,0) tipinə bərabərdir. Təcrübəyə əsasən Microsoft SQL Serverdə DECİMAL tipinə daha çox üstünlük verilir.
Bu tiplər ANSİ SQL standartı tərəfindən dəstəklənir və eyni cür adlandırılır.
Oracle Batabase – də bu tipin analoqu NUMBER (p, s) tipidir. Yəni Microsoft SQL Serverdə olan DECİMAL (20,4) və NUMERİC (20,4) Oracle Batabase – də olan NUMBER (20, 4) tipiylə eynidir. “ANSİ, DB2, and SQL/DS Datatypes” uyğun olaraq Oracle Database – də cədvəl yaradılan zaman DECİMAL (p, s) və NUMERİC (p, s) tiplərini istifadə etmək olar. Oracle VBİS tərəfindən həmin tiplər avtomatik olaraq NUMBER(p, s) tipinə çevrilir və verilənlər bu tipdə saxlanılır.
Bu tiplərdə dəqiqlik və miqyas hədlərin qoyulması verilənlərin yaddaşda tutduğu yerə görə və verilənlər bazasının həcminə daha səmərəli şəkildə nəzarət etmək üçün tətbiq edilib. Məsələn, sütunda saxlanılacaq onluq kəsr ədədinin dəqiqliyi 9-u aşmayacağını dəqiq biriksə, DECİMAL (9,4) tipini təyin etsək bu tipdə saxlanılan verilənlərin hər biri yaddaşda 5 bayt tutacaq, DECİMAL (38,4) təyin etsək 17 bayt tutacaq. Dəqiqliyə yuğun tutulan yaddaş həcmi aşağıdakı cədvəldə göstərilib:
Dəqiqlik |
Yaddaşda tutduğu yer, bayt |
1 – 9 |
5 |
10-19 |
9 |
20-28 |
13 |
29-38 |
17 |
PUL (VALYUTA) QIYMƏTLƏRI OLAN VERILƏNLƏR TIPLƏRI.
Bu kateqoriyaya MONEY və SMALLMONEY tipləri daxildir:
Verilənlər tipləri |
Dəstəklədiyi diapazon |
Yaddaşda tutduğu yer |
money | -922 337 203 685 477,5808 dən 922 337 203 685 477,5807 dək | 8 bayt |
smallmoney | -214 748,3648 dən 214 748,3647 dək | 4 bayt |
Bu tiplər ANSİ SQL standartı tərəfindən dəstəklənmir və xüsusi olaraq Microsoft SQL Serverə aiddir və pul tipində olan verilənlərin saxlanılması üçün istifadə edilir. Məsələn: əmək haqqı, bank aktivləri və s. Bu tiplər yuxarıda göstərilən DECİMEL və NUMERİC tipləri ilə demək olar ki eynidir. MONEY tipi NUMERİC(10,4) tipinə və SMALLMONEY tipi NUMERİC(19,4) tipinə uyğundur. Pul tiplərinin NUMERİC və DECİMAL tiplərindən əsas fərqi ondan ibarətdir ki, pul tipli sətirdə olan qiymət pul vahidinin simvoluyla başlaya bilər.
Bu tiplərin Oracle Database – də analoqu yenə də NUMBER tipidir. Lakin diqqət etsək görərik ki, MONEY tipində maksimal olaraq 19 rəqəmdən və vergüldən sonra maksimal olaraq 4 rəqəmdən ibarət olan onluq kəsr ədədlər, SMALLMONEY tipində maksimal olaraq 10 rəqəmdən və vergüldən sonra maksimal olaraq 4 rəqəmdən ibarət olan onluq kəsr ədədlər saxlanıla bilər. Buna uyğun olaraq Oracle Batabase – də MONEY tipinin analoqu NUMBER(19,4) tipi, SMALLMONEY tipinin analoqu isə NUMBER(10,4) tipidir.
BİT
0, 1 və NULL qiymətlərini qəbul edə bilən tam ədədlər verilənlər tipidir.
SQL Server Database Engine bit tipli sütunlarda saxlanılan verilənləri optimallaşdırır. Əgər cədvəldə bit tipində 8 və ya daha az sütun varsa, onlar 1 bayt kimi saxlanılır. Əgər bit tipində 9-dan 16-a qədər sütun varsa, onlar 2 bayt kimi saxlanılırlar və s.
TƏXMINI ƏDƏDLƏR (APPROXIMATE NUMERICS) VERILƏNLƏR TIPLƏRI.
Bu kateqoriyaya REAL və FLOAT tipləri daxildir.
Bu tiplər vergülün yeri dəqiq olmayan onluq kəsr ədədlərinin saxlanılması üçün istifadə edilir. Yazılış sintaksisi:
float [ (n) ]
Burada n – ədədin mantissasının (onluq ədədin uzunluğu və ya rəqəmlərin sayı) saxlanılması üçün yaddaşda ayrılan yeri bildirir. n parametrinin qiymətli 1 dən 53-ə qədər təyin oluna bilər. Bu parametr təyin olunmayıbsa ilkin təyinetməyə görə (default) 53 qiyməti təyin olunur. Həmin parametr 1 dən 24 – dək təyin olunubsa saxlanılan verilənlərin hər biri üçün yaddaşda 4 bayt ayrılır və saxlanılan ədəd maksimal olaraq 7 rəqəmdən ibarət ola bilər. Parametr 25 dən 53 – dək təyin olunubsa saxlanılan verilənlərin hər biri üçün yaddaşda 8 bayt ayrılır və saxlanılan ədəd maksimal olaraq 15 rəqəmdən ibarət ola bilər. Yuxarıda deyildiyi kimi, bu hədlərin qoyulması verilənlərin yaddaşda tutduğu yerə görə və verilənlər bazasının həcminə daha səmərəli şəkildə nəzarət etmək üçün tətbiq edilib. REAL tipində belə parametr göstərilmir və ilkin təyinetməyə görə bu tpdə saxlanılan ədədlər üçün yaddaşda 4 bayt ayrılır və saxlanılan ədəd maksimal olaraq 7 rəqəmdən ibarət ola bilər.
Daha aydın olması üçün dəqiq və qeyri dəqiq onluq kəsrlərin saxlanılması üçün tiplərin seçilməsini nümunələr üzərində göstərək:
Test bazasını yaradaq. Həmin bazada MyTable cədvəlini və həmin cədvəldə DECİMAL, NUMERİC, FLOAT və REAL tipində sütunlar yaradaq, sütunlara müəyyən ədədlər əlavə edək və sonda cədvələ sorğu verək:
USE test
GO
IF EXISTS (SELECT 1 from sys.objects WHERE name = 'MyTable'and TYPE = 'u')
DROP TABLE MyTable
CREATE TABLE dbo.MyTable
(
DecimalColumn decimal(7,3)
,NumericColumn numeric(15,3)
,RealColumn real
,FloatColumn float(50)
);
GO
INSERT INTO dbo.MyTable (DecimalColumn, NumericColumn, RealColumn, FloatColumn)
VALUES (1234.5678, 123456789123.4567, 1234.5678, 123456789123.4567);
INSERT INTO dbo.MyTable (DecimalColumn, NumericColumn)
VALUES (12345.678, 1234567891234.567);
INSERT INTO dbo.MyTable (RealColumn, FloatColumn)
VALUES (12345.678, 1234567891234.567);
GO
SELECT DecimalColumn, NumericColumn, RealColumn, FloatColumn
FROM dbo.MyTable;
Göründüyü kimi, yaratdığımız sütunlara tiplərə uyğun olaraq ədədlər əlavə etdik: decimal və real sütununlarına 1234.5678 ədədini, numeric və float sütununlarına 123456789123.4567 ədədini. Daha sonra həmin onluq ədədlərin vergüllərinin yerlərini bir qədər sağa doğru dəyişdik və yenidən müvafiq sütunlara əlavə etməyə cəhd etdik. Nəticədən göründüyü kimi, decimal və numeric sütunlarında bu əməliyyat tiplərin məhdudiyyətlərinə görə icra olunmadı və bu barədə müvafiq mesaj çıxdı. Real və float sütunlarında isə bu əməliyyat uğurla həyata keçirildi və ədədlər cədvələ əlavə edildi. Cədvələ sorğu verməklə bunu görmək olar.
Results:
DecimalColumn | NumericColumn | RealColumn | FloatColumn |
1234.568 | 123456789123.457 | 1234,568 | 123456789123,457 |
NULL | NULL | 12345,68 | 1234567891234,57 |
Messages:
(1 row(s) affected)
Msg 8115, Level 16, State 8, Line 15
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.
(1 row(s) affected)
(2 row(s) affected)
Diqqət etdinizsə, ədədlərin uzunluğu və ya rəqəmlərin sayı qəsdən artırılmışdır. Məsələn: DECİMAL(7,3) tipi maksimal olaraq 7 rəqəmli ədəd dəstəklədiyi halda biz 8 rəqəmli ədəd əlavə etdik. Bu zaman sonuncu rəqəm yuvarlaqlaşdırıldı – 1234.5678 ədədini əlavə etdik, nəticədə isə 1234.568 ədədini aldıq.
Vergülün yeri dəqiq olmayan onluq kəsr ədədlər tipləri ədədlərin daha böyük diapazonda əlavə edilməsinə icazə verir. Lakin unutmaq lazım deyil ki belə ədədlər maksimal olaraq 15 rəqəmdən ibarət ola bilər. Əgər çox böyük bir ədədin üstünə çox kiçik bir ədəd gəlsək, nəticə ilkin olan qiymətdən fərqlənməyəcək. Bu və digər səbəblərə görə FLOAT və REAL tiplərindən istifadə olunması məsləhət görülmür.
Bu tiplər ANSİ SQL standartı tərəfindən tam dəstəklənir. ANSİ SQL standartında olan DOUBLE PRECISION tipi T-SQL – də olan FLOAT(53) tipinə uyğundur
Oracle Batabase – də REAL tipinin analoqu FLOAT(23), parametrləri 24 dən 53-ə qədər olar FLOAT tipinin analoqu FLOAT(49). Microsoft SQL Serverdən fərqli olaraq Oracle Batabase – də olan FLOAT tipindəki n parametrinin qiymətli 1 dən 126-ə qədər təyin oluna bilər. Buna uyğun olaraq T-SQL-in FLOAT([1-53]) tipinin PL/SQL-də olan analoqu FLOAT([1-53]) tipidir, həmçinin PL/SQL-də olan FLOAT([54-126]) tipinin T-SQL-də olan analoqu FLOAT tipidir. PL/SQL-də daha çox BİNARY_DOUBLE və BİNARY_FLOAT tipləri istifadə olunur.
Dərsimizin birinci hissəsinin sonuna gəlib çatdıq. Bu hissədə T-SQL –də istifadə olunan tam ədədlər, dəqiqliyi və miqyası təyin olunmuş onluq kəsr ədədlər, pul (valyuta), təxmini ədədlər verilənlər tipləri barədə bəhs etdik.
Ümid edirəm ki, yuxarıda təqdim etdiyim cədvəl tiplərinin müqayisəsi üçün yararlı olacaq və aktiv istifadə olunacaq.
Diqqətinizə görə təşəkkür edirəm.