MSSQL Server Veri Türleri

Bu makalede Sql Server veri tiplerini görmüş olacağız. Bir veritabanı oluştururken kullanacağımız veri türleri  oldukça önemlidir. İhtiyaçlarımızın doğrultusunda oluşturulması gerekmektedir. Sql server yapımızda performansı önemli ölçüde etkileyen bir yapı olarak karşımıza çıkmaktadır. Büyük uygulamalarda veri türünü doğru bir şekilde belirtmek gerekmektedir. Yanlış veri türü seçilirse veriler disk alanında daha fazla yer kaplayabilir veya sorguların daha geç gelmesine sebep olur buda performansı olumsuz bir etki yapmaktadır.

SQL Server aşağıdaki veri türü kategorilerini destekler:

  • Tam sayısal : bit, tinyint, smallint, int, bigint, decimal, numeric, money ve smallmoney
  • Rasyonel sayısal: Real-Float
  • Tarih ve saat: Date, DateTime, datetime2, datetimeoffset, smalldatetime, time
  • Metin dizileri :char, varchar, text
  • Unicode metin dizeleri : Nchar, Nvarchar, Ntext
  • İkili(Binary) dizeler: Binary,Image ve varbinary
  • Diğer veri türleri: Cursor, hierarchyid, sql_variant, table, rowversion, uniqueidentifier, XML, Spatial ve geography

Not: SQL Server, gelecek sürümlerde ntext, text ve image veri türlerini kullanımdan kaldıracaktır. Bu veri türlerinin kullanımından kaçınmalıyız. Nvarchar(max), varchar(max) ve varbinary(max) kullanabilirsiniz .

Sayısal SQL Server Veri Türü

Tam sayı, ondalık ve para için kesin sayısal veri türlerini kullanırız. Her veri türünün kendi alt, üst sınırı ve bellek gereksinimleri vardır. Bellek gereksinimlerini kaydetmek için en küçük veri türünü de kullanmalıyız. Örneğin, true (1) veya false (0) değerlerini depolamak için bit veri türünü kullanabiliriz.

Veri TipiMinumum DeğerMaksimum DeğerKapladığı AlanAçıklama
Bit011 baytBurada NULL değerleri de saklayabiliriz. Var yada yok ifadeleri, genellikle evet/hayır şeklinde mantıksal bilgileri tutmak için kullanılır.
tinyint02551 baytBu veri tipinde 255’e kadar tam sayıları saklayabiliriz.
Smallint-2^15 (-32.768)2^15-1 (32.767)2 baytDaha düşük ve daha yüksek aralıktaki tam sayıları saklayabiliriz.
Int−2^31 (−2.147, 483.648)2^31−1 (−2.147, 483.647)4 baytAynı zamanda smallint’e benzer şekilde tam sayıyı depolar ancak alt ve üst sınırları tanımlandığı şekilde değişir.
Bigint−2^632^63−18 baytEğer integer veri tipine veri sığdıramıyorsak bigint veri tipini kullanmalıyız.
Decimal-10^38+110^38−11-9=5  Byte
10-19=9 Byte
20-28=13 Byte 29-38=17 Byte
Ondalık veri türünü şu amaçlar için kullanırız: ölçek ve sabit hassasiyetli sayılar. Hassasiyete göre boyutu değişmektedir. decimal (5, 2) toplamda 5 basamak 2 ondalık kısmıdır. Bu ifade toplamda 5 byte
Numeric-10^38+110^38−1Decimal ile aynıdır.Decimal ve Numeric eştir. Bunları birbirinin yerine kullanabiliriz. Hassasiyete göre boyutu değişmektedir.
smallmoney-214.478,3648+214.478,36474 baytBu veri tipini parasal veya döviz değerleri için kullanabiliriz. Money tipinde olduğu gibi  4 basamağa kadar ondalık veri tiplerini saklamaktadır.
Money−922.337, 203, 685.477,5808+922.337, 203, 685.477,58078 baytBu veri tipini parasal veya döviz değerleri için kullanabiliriz.

Rasyonel Sayı SQL Server Veri Türü

Veri TipiMinumum DeğerMaksimum DeğerKapladığı AlanAçıklama
Real-3.438  ile -1.1838, 01.1838 ile 3.4384 bayt
Float(n)  -1.79308 ile –2.23308, 0  2.23308 ile    1.79308(1-24)7 basamak->4 bayt
(25-53)15 basamak->8 bayt
float (n) şeklinde parametre alır. 1-53 arası değer alabilir, belirtilmezse varsayılan değer 53’tür.

Tarih ve Saat SQL Server Veri türleri

Bu veri tiplerini kullanarak tarih ve saat verilerini, zaman ofsetiyle birlikte depoladık.

Veri TipiMinumum zamanMaksimum zamanKapladığı AlanAçıklama
Date0001-01-019999-12-313 bayt1. SQL Server’da sadece tarihleri ​​saklar. 2. Varsayılan değeri 1900-01-01’dir. 3. Varsayılan formatı sağlar YYYY-AA-GG.
Datetime1753-01-01 00:00:00.0009999-12-31 23:59:59.9978 baytBu veri türünü kullanmaktan kaçınmalıyız. Bunun yerine Datetime2 kullanabiliriz.
Datetime20001-01-01 00:00:009999-12-31 23:59:59.99999991-2-> 6 bayt
3-4-> 7 bayt
5-7->8 bayt
100ns doğrulukla 0 ile 7 basamak arasında hassasiyet sağlar. Datetime2(3) dersek 2025-12-23 23:23:23.567 noktadan sonra 3 hane buda 7 byte eşittir.
Datetimeoffset0001-01-01 00:00:009999-12-31 23:59:59.999999910 baytdatetime2 veri türüne benzer ancak zaman dilimi farkını da içerir. Saat dilimi -14:00 ila +14:00 arası değer alabilir. Uygulamalarınızda farklı zaman dilimlerini kullanan ülkelerin tarih verilerini saklıyorsak kullanışlıdır. Datetime2 + saat dilimi kodu olarak düşünebiliriz. YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm] şeklinde default saklama şekli vardır. Örnek: 11.09.2023 20:30:15.1234567 +03:00
smalldatetime1900-01-01 00:00:002079-06-06 23:59:594 bayt1. Günün saatini belirten bir tarih tanımlar. 2. Varsayılan değeri 1900-01-01 00:00:00’dır. 3. Bir dakikalık doğruluk sağlar.
Time00:00:00.000000023:59:59.99999995 bayt1. Sadece zaman verilerini saklamak için kullanabiliriz. 2. Varsayılan biçimi hh:mm:ss[.nnnnnnn]’dir. 3. 100 nanosaniye doğruluk sağlar.

Metinsel SQL Server Veri türleri

Veri TipiMinumum karakter Maksimum karakterKapladığı AlanAçıklama
char (n)0 karakter8000 karakterN baytChar(100) =100 byte, İçerisinde 20 veri olsa bile giriş yapılan boyut kadar alan kaplar. Karakter olmazsa bile boşluk koymaktadır
Varchar(n)0 karakter8000 karaktern bayt + 2 baytVarchar(100)=102 byte, Char’dan farklı olarak  verinin boyutu kadar yer kaplar.
Varchar (max)0 karakter2^31 karaktern bayt + 2 bayt ~ 2 GBÇok büyük depolama alanı gerektirmesi nedeniyle bu veri tipini kullanmaktan kaçınmalıyız. 8000 byte ve altındaki uzunlukları in row olarak saklayabilirken 8000 byte’dan fazlasını out of row olarak saklar.
Text0 karakter2.147.483.647 karaktern bayt + 4 baytDeğişken uzunlukta karakter veri tipidir. SQL Server’ın gelecekteki sürümlerinde kullanım dışı kalabileceğinden bu veri tipini kullanmaktan kaçınmalıyız. Belirtilenden az bir değer girilsede  boyutu kadar yer kaplamaktadır.

Unicode Metinsel SQL Server veri türleri

Bu ifadelerdeki N  Japonca,Çince gibi global ifadeler içinde kullanılmaktadır. Sadece N ifadesi karakterlerin 2 byte yer kaplamasına sebiyet verecektir.

Veri TipiMinumum karakterMaksimum karakterKapladığı AlanAçıklama
Nchar0 karakter4000 karakter2 kez n baytNchar(100)=200 byte, Sabit genişlikte bir Unicode dizesidir. 1 karakter 2 byte’dır. İçerisinde 20 veride olsa 200 byte yer kaplar.
Nvarchar0 karakter4000 Karakter2 kez n baytVarchar veri tipindeki gibi verinin boyutu kadar yer kaplamaktadır. Nvarchar(100)=200 byte
Ntext0 karakter1.073.741.823 karakterDize uzunluğunun 2 katıText’ten farklı olarak girilen karakter boyutu kadar yer kaplar. Gelecekteki SQL sürümlerinde kullanımdan kaldırılacağı için bu veri tipini kullanmaktan kaçınmalıyız.

NVARCHAR(MAX)
0 karakter2^31 karakter2 kez n baytÇok büyük metin verisi saklamak için (2^31-1 karaktere kadar) uygundur.

Not:  Char türündeki verilerde arama hızımız varchar’a göre daha hızlıdır. Çünkü sabit bir boyutu vardır. Disk büyüklüğü için sıkıntı oluşturduğu için Char veri tipini kullanmak bizlere sıkıntıya sebebiyet verecektir.

Binary SQL Server Veri Türleri

Bu veri türleri genellikle resim, ses, video gibi dosyaları veya ham veri akışlarını saklamak için kullanılır.

Veri TipiMinumum DeğerMaksimum DeğerKapladığı AlanAçıklama
Binary0 bayt8000 baytN baytBu veri türü sabit genişlikte ikili bir dizedir. Binary(100)=100 byte’lık yer kaplar.
varbinary0 bayt8000 baytN bayt + 2 byte’tır.Binary’den farklı olarak girilen karakter kadar yer kaplar. Binary(100)=102 byte
Varbinary(max)0 bayt2 147 483 647  baytN bayt + 2 byte’tır.Girilen karakter kadar yer kaplar. Varbinary(1000250)=10000252
Image0 bayt2.147.483.647 baytResim dosyalarını saklamak için kullanılır. SQL Server sürümlerinde kullanımdan kaldırılacaktır. Bunun yerine varbinary(MAX ) kullanılması tercih edilir.

Diğer veri türleri:

İhtiyaca göre kullanılabilecek birkaç veri türü daha vardır:

Cursor: Değişkenler veya saklı yordamlar için yararlıdır OUTPUT parametresi bir imlece referans verir

Rowversion : Bir veritabanında otomatik olarak oluşturulan, benzersiz ikili sayıları döndürür. Veritabanındaki bir tabloda bir insert yada modifikasyon yapıldığında otomatik artan bir counter vardır. Bu counter veritabanının rowversion’ıdır. Bir tabloda bir tane kolon rowversion olarak tanımlanabilir. Timestamp’te rowversion’ın aynısıdır ve sonraki sürümlerde kullanılmayacaktır.

Bu yapı bir kaydın son okunduktan sonra değişip değişmediğini gözlemlemek için kullanılmaktadır. Aşağıdaki örnek bu yapının açıklamasıdır.

-- Tablo oluşturma örneği
CREATE TABLE Musteriler (
    MusteriID INT PRIMARY KEY,
    Ad NVARCHAR(50),
    Soyad NVARCHAR(50),
    KayitTarihi DATETIME,
    VersiyonBilgisi ROWVERSION -- Satır değiştikçe otomatik güncellenir
);

-- Veri ekleme
INSERT INTO Musteriler (MusteriID, Ad, Soyad, KayitTarihi)
VALUES (1, 'Ahmet', 'Yılmaz', GETDATE());

-- rowversion değerini görüntüleme
SELECT MusteriID, Ad, Soyad, VersiyonBilgisi 
FROM Musteriler;

-- Veriyi güncelleme (rowversion otomatik değişecek)
UPDATE Musteriler 
SET Soyad = 'Kaya' 
WHERE MusteriID = 1;

-- rowversion değerinin değiştiğini gözlemleme
SELECT MusteriID, Ad, Soyad, VersiyonBilgisi 
FROM Musteriler;

sql_variant: sayı,metin, binary gibi farklı veri tiplerini depolamak için kullanılan veri tipidir.Yani bir sütun ya da fonksiyonda birden fazla veri tipi kullanmamız gerektiğinde tercih etmeliyiz. sql_variant ile ilgili bilinmesi gereken şeylerden biri de veriyle işlem yapacağımız zaman (örneğin toplama işlemi) bu veri tipinin öncelikle uygun tipe dönüştürülmesi gerektiğidir. ODBC, sql_variant’ı tam olarak desteklemez. 

CREATE TABLE OrnekTablo (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    DegiskenAdi NVARCHAR(50),
    Deger sql_variant,
    VeriTuru NVARCHAR(30) -- Hangi türde veri saklandığını belirtmek için
);

-- Farklı veri türlerinde değerler ekleme
INSERT INTO OrnekTablo (DegiskenAdi, Deger, VeriTuru)
VALUES 
    ('Tamsayi', 42, 'INT'),
    ('Ondalikli', 3.14159, 'DECIMAL(6,5)'),
    ('Metin', 'SQL Server', 'NVARCHAR(50)'),
    ('Tarih', GETDATE(), 'DATETIME'),
    ('Mantiksal', 1, 'BIT');

Hierarchyid : Değişken uzunlukta bir sistem veri türüdür. Bunu bir hiyerarşideki bir pozisyonu temsil etmek için kullanırız

Uniqueidentifier : 16 bayt GUID sağlar. GUID(global olarak tekilliği garanti eder) veriyi tutar. select NEWID() script’ini çalıştırdığınızda aşağıdaki gibi bir GUID veri oluşturur.

A4C5DB26-7F18-4B4F-A898-E7DE26A8446A

Bazen veritabanlarında tekilliği sağlamak için kullanılır. Ama bu amaçla kullanıldığında genelde performansı düşürür.

Geometry : Bunu, verileri düz (Öklid) koordinat sisteminde temsil etmek için kullanabiliriz

XML: SQL Server tablolarında XML verilerini depolamak için kullanılan özel bir veri türüdür. Kapasitesi 2 GB’dır. Sakladığımız textleri sorgulanabilir bir hale getirilir.

Geography: GPS enlem ve boylam koordinatları gibi elipsoidal (dünyanın etrafında) verileri depolamak için Mekansal Coğrafya türünü kullanabiliriz. Verileri dünyanın etrafında bir koordinat sisteminde temsil eder

Table: Sonuç kümesini geçici olarak tablo değerli bir fonksiyonda depolamak için yararlı olan özel bir veri türüdür. Daha sonra işlemek için buradan gelen verileri kullanabiliriz. Fonksiyonlarda, saklı prosedürlerde ve toplu işlerde kullanılabilir

Bu makalede Sql Server Veri Türlerini detaylı bir şekilde görmüş olduk. Ayrıca microsoft’un sayfasında detaylı bir şekilde bakılabilir.  Başka bir makalede görüşmek dileğiyle..

Onlar – ” Allah’ın Ayetlerini Az Bir Menfaatle Değiştirmezler ” Ali Imran-199 

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir