25 Şubat 2012 Cumartesi

SQL Server Veri Tipleri (2 Bölüm)

Konumuz olan SQL server veri tipleri, yalnızca tablolar sütunlarında değil, değişkenler ve parametreler gibi diğer veritabanı nesneleri için de zorunludur.


Tarih ve Saat Tipleri


Tarih ve tipleri kadar, veri saklarken tartışmaya yatkın çok az veri tipi vardır. Uygulamaların bazıları sadece tarih verisi ile yetinirken, diğer bazı uygulamalar, zaman verisini saklamaya odaklanır. Elbette pek çok uygulama her ikisini saklamaktadır.
SQL Server Tarih ve Saat tipi olan datetime ve smalldatetime ise, her ikisi veriyi de içinde barındırmaktadır.

SQL Server'da zaman bilgisini tutan iki tip mevcuttur: datetime ve smalldatetime.

datetime, 8 byte'lık bir alan kapsamaktadır.1 Ocak 1753'den 31 Aralık 9999'a kadar olan

tarih verilerini 3.33 milisaniyelik bir sapma ile saklayabilirsiniz.


smalldatetime ise, 4 byte'lık bir alan kapsamaktadır. 1 Ocak 1900'den, 6 Haziran
2079 'a kadar olan verileri, 1 dakikalık sapma ile saklayabilirsiniz.



Karakter Veri Tipleri

SQL Server karakter tipleri, seçeceğinize karakter kodlamasına göre her bir karakter için 1(Bir) ya da 2(iki) bytelık alan kullanacaktır. Bu, ANSI ya da Unicode karakter kodlamalarından birini seçmenizebağlı olarak değişecektir.

ANSI ve Unicode

Uzmanlar, çeşitli dillerdeki karakterleri, bir standart formatta saklamak ve ifade edebilmek için ANSI standartlarını geliştirdiler. Bu standartta her bir karakter, 8 bitlik bir işaretleme ile kodlanıyordu. Fakat sorun şuydu ki, bu 8 bitlik kapasite, tüm karakterleri saklamak için yeterli değildi.
Bu problemi aşmak için uluslararası bir karakter kodlama standardı olan Unicode tasarlandı. Unicode, ANSI'nın aksine, her bir karakter için 2 bytelık bir alan kullanmaktadır

SQL Server' da, bu iki format ile kodlanan verileri saklamak için karakter tipleri içinde iki varyasyon sunmaktadır. SQL Server'da Unicode veriler için kullanılacak veri tipleri, veri tipi adının önüne eklenenbir "n" harfiyle imlenmektedir. (Örneğin, nchar).

SQL Server'da karakter tipi tanımlanırken, tip kapasitesi de belirtilmektedir.
Örneğin, char(10) şeklinde bir tanımlama yaptığımızda, veri tipimiz maximum 10 karakterlik veri içerebilecektir. Fakat tanımlamamızı, nvarchar(10) olarak yaptığımızda, veri tipimiz, 5 karakterlik bir veri içereccektir. Bunun sebebi ise, Unicode karakter kodlamasında her bir
karakteri 2 byte ile saklanmasıdır.

SQL Server Sabit Genişlikli Karakter Tipleri

char(n) : Maximum 8.000 byte yani 8.000 karakterlik veri saklayabilir. ANSI tipinde

veriler içerebilir. Sabit genişliktedir.



nchar(n) : 8.000 byte'lık veri saklayabilir. char tipinden farklı olarak, nchar tipi Unicode tipinde veri içereceği ve Unicode formatında her bir karakter 2 bytelık bir alanda saklandığı için bu tipin kapasitesi 4.000 karakter olacaktır.

SQL Server Değişken Genişlikteki Veri Tipleri

varchar(n) - 8.000 bytelık veri içerebilir. Maximum 8.000 karakterlik veri saklar.Genişliği içerdiği veriye bağlı olarak değişmektedir. ANSI kodundaki verileri saklar.

varchar(max) 2 GB'e kadar veri ve 1.073.741.824 'e kadar karakter saklayabilir. Genişliği, içerdiği veriye göre değişkenlik gösterir. ANSI tipindeki karakter verilerini saklar.

nvarchar(n) : Tip isminin önündeki "n" harfinden de anlaşılacağı üzere, Unicode veri tiplerini saklar. 8.000 bytelık kapasitesi vardır. Maksimum 4.000 karakter içerebilir.

nvarchar(max) 2 GB'e kadar veri ve 536.870.912 adet karakter saklayabilir.Genişliği, içerdiği verilere göre değişebilir.

text : 2 GB ' e kadar veri saklayabilir. ANSI türünde verileri ihtiva eder.
ntext : 2 GB 'e kadar veri ve 536.870.912 adet karakter saklayabilir. Unicode türünde veri ihtiva eder.

text-ntext ve varchar(max)-nvarchar(max) ikililerinin kapasite olarak birbirlerinin

aynı olduğu dikkatinizi çekmiştir. text ve ntext veri tipleri ile, yüksek kapasiteli metinsel verileri saklayabilirsiniz fakat, ntext ve text veri tiplerini, join, where ve sistem fonksiyonları gibi pek çok operasyonda kullanamazsınız.



Binary (İkililik) Veri Tipleri

Geliştiriciler çoğu zaman, resim, müzik dosyaları, çalıştırılabilir dosyalar gibi binary olarak adlandırılan türden dosyaları sistemlerinde saklamak zarureti hissederler.

Bu bir insan kaynakları formundan gönderilen, personel adayı resmi olacağı gibi, X sistem üzerine kullanıcılar tarafından yüklenen bir dosya da olabilir.

SQL Server, bu nedenlerden ötürü, üç veri tipini kullanıma sunmaktadır. Şimdi sırası

ile, bu üç veri tipini inceleyeceğiz.

binary(n) 8.000 byte'lık bir saklama kapasitesi vardır. Sabit genişliktedir.

varbinary(n) : 8.000 byte'lık bir kapasitesi vardır. İçerdiği veriye göre boyutu

değişebilir.

varbinary(max) 2 GB'a kadar olan verileri saklayabilir. Alan genişliği içerdiği veriye

göre değişkenlik gösterir.

image : 2 GB'e kadar veri saklayabilir. Alan genişliği, içerdiği veriye göre değişiklik

gösterir.

binary/varbinary veri tiplerini, boyutları 4 ile 6 KB arasında değişen verileri saklamak

için kullanabilirsiniz.

Binary veri tipleri arasında en popüler olanı image veri tipidir. Talihsiz bir isme sahiptir, diyebiliriz. Her türlü ikilik veriyi saklayabileceği halde, isminden ötürü yalnızca image türündeki dosyalarısaklayabileceğine dair bir sanı oluşmaktadır. Resim dosyalarını olduğu gibi, Word, Excel, PDF türündeki dosyaları da image veri tipi içerisinde saklayabilirsiniz.

EK:
varbinary(max) veri tipi, SQL Server 2005 sürümü ile birlikte gelmiştir. image veri

tipi ile aynı kapasitededir ve image veri tipinin saklayabileceği tüm verileri saklayabilir. varbinary(max) tipinde saklanan veriler, tüm operasyon ve fonksiyonlarda kullanılabilmektedir.

Sabit Genişlik ve Değişken Genişlik Nedir?

Bunu bir örnekle anlatmakta fayda var. TC Kimlik numarası sabit genişlikte bir veridir, 11 hane olması zorunludur. Aynı şekilde kredi kartları da 16 hanedir. Bu türsabit genişlikteki veriler için
kullanacağımız veri tipini doğru seçmeliyiz.
Örneğin, TC kimlik numarası için sabit genişlikte veri tipi barındıran, char(11) 'i kullanabiliriz.

declare @tckimlik as char(11)

set @tckimlik='12345678901'


Değişen genişlikteki verilere örnek olarak web adreslerini ya da eposta adreslerini örnek verebiliriz. Kullanıcı datalarını saklayacağımız bir tablomuz olduğunu düşünün. Kullanıcının şayet bir web adresi varsa, bunu da belirtmesini istiyoruz ve bu datayı da veritabanı tablomuzda saklıyoruz.

Web adresleri, maximum 255 karakter olabilir. Bu aslında tablo tasarımımız için de bir kaideyi baştan ortaya koyuyor. Yani web adresini saklayacağımız tablo kolonu en fazla 255 karakter alabilir. Elbette, istisnaları da vardır; kişinnin web adresi 255 karakterden daha da az olabilir.

Web adresi için char tipinde bir kolon tanımladığımızı düşünelim.

declare @char_websiteurl as char(255)
set @char_websiteurl='www.google.com'

Bir de web adresini saklayacağımız kolonu

varchar(255) olarak tanımlayalım:

declare @varchar_websiteurl as varchar(255)
set @varchar_websiteurl='www.google.com'


Şimdi test edelim..

select '|'+@char_websiteurl+'|'
select '|'+@varchar_websiteurl+'|'

Gördüğünüz gibi web sitesini barındıran değişkenleri yazdırırken, pipeler (|) koyarak, metinlerin başladığı ve sonlandığı yerleri işaretledik. Char ve diğer sabit genişlikteki veri tipleri, içinde sakladığınız veri, tanımlanma aşamasında belirtmiş olduğunuz karakter sınırında olsun ya da olmasın, karakter uzunluğunu, tanım esnasında belirtilen alan kadar boşluklarla dolduracaktır.

Bu sebeple, sabit olmayan genişlikteki alanlarınız için, veri tipi tanımlarında işaret ettiğimiz, değişken genişlikteki veri tiplerini kullanmanızı tavsiye ederim.


1 yorum:

Adsız dedi ki...

Yazı için teşekkürler.
Hepsini okudum bilgi için teşekkürler fakat yeni olduğum için tam olarak hangisi kullanacağımı kestiremiyorum.
Ben sadece sayısal herşey için örneğin kolondaki kullanıcının 0 mı 1 mi olduğunu sorgulamak için int,
sitenin içeriği, fotografların yolu vs. nvarchar.
Yazıdan anladığıma göre sayısal ifade için (0,1) tinyint .
Resim yolları için, nchar

Bizim türkçe karakter sıkıntısı çekmemek için (n)türlerini kullanmamız gerekecek.
Burda kavrayamadığım şu:

nvarchar(n) : 8.000 bytelık kapasitesi vardır. Maksimum 4.000 karakter içerebilir.
nvarchar(max) 2 GB’e kadar veri ve 536.870.912 adet karakter saklayabilir.

Burası aklımı karıştırdı. 2 side 8 bit ikiside nvarchar n dediğimiz nedir? nvarchar max. 4.000 karakter kaplıyosa
o zaman nvarchar(max) = 4.000 olmalı değil mi? 536.870.912 ne oluyor o halde?

nvarchar bildiğim kadarıyla,
nvarchar(50) mesela, max 50 karakter alacak, içeriği 50 karakterden de az ise mesela 34, kalan 16 karakterlik boyut tutmayacak.. Doğrumu bilmiyorum

Standart bir websitesinde mesela (haber) sitesi hangi türü kullanmak faydalı olur?
nvarchar - ntext