Sistem tanımlı veri türleri kategorileri:
* Karakter Dizilimi (Character strings)
* Unicode karakter dizilimi (Unicode character strings)
* Tarih ve saat (Date and time)
* Tahmini sayısal (Approximate numeric)
* Kesin sayısal (Exact numeric)
* Tamsayılar (Integer numbers)
* Parasal (Monetary)
* Çift değişkenli (Binary)
* Özel (Special)
Bazı durumlarda, bir veri türünü T-SQL kodda ilişkilendirmek için farklı tanımlayıcılar/tanıtıcılar kullanabilirsiniz. Örneğin; Char veri türü Karakter olarak, varchar ise karakter çeşitliliği olarak ele alınabilir. Bu eş anlamlı sözcüklerin bazıları ANSI SQL-92 standart gereksinimlerine dayanmaktadır.
Karakter veri türleri karakter dizilimlerini içerir. Dört farklı karakter türü, uzunlukları ve depolama özellikleri açısından çeşitlilik gösterirler.
* char
* varchar
* varchar(max)
* text
Char veri türü, sabit boyuttaki dizilimleri depolamak için kullanılır. Daha önce belirtildiği gibi, bu veri türünün maksimum uzunluğu/boyutu 8,000 karakterdir ki bu, eski versiyonlardaki 255 karakter limiti bağlamında kayda değer bir artıştır. Bir değişken veya bir tablo sütunu nominal boyutundan daha kısa boyuttaki bir dizilimle atanmışsa, bu değişken belirli alan uzunluklarını doldurmak için ardındaki boşluklarla tıkanmıştır.
Varchar veri türü 8,000 karakter uzunluğa kadar olan çeşitli boyutlarda dizilimleri depolar. Uzunluğu nominal boyuttan az olan karakter değeri bir sütuna veya bir değişkene atandığında SQL Server peşinden boşluklar eklemek yerine onu olduğu gibi kaydeder. Varchar veri türleri dizilimin uzunluğunu kaydetmek için 2 ilave byte kaplar/tutar.
text veri türü büyük miktarlardaki datayı depolamak için kullanılır. Tek bir alan 2GB (231 - 1 byte) bilgiye kadar depolayabilir. Sadece 16 byte pointer tabloda depolanır. Bu nedenle ilave işlem, metin sütunlarının kullanımıyla ilişkilendirilir. Metin değerleri işlemi için bazı özel fonksiyonlar bulunmaktadır.
Not text veri türlerini kullanmaktan kaçının çünkü Microsoft, SQL Serverın gelecek versiyonlarında bunu kaldırmayı planlamaktadır. Onun yerine yeni varchar (max) veri türü kullanılmalıdır.
Varchar (max), varchar veri türü gibi görünür ve işler ancak dahili yapı ve işlevselliği daha çok metin veri türü gibidir.
Aynı zamanda 2 GBa kadar olan geniş dizilimleri depolamak için tasarlanmıştır. Dizilim, kaydın geri kalanıyla veri sayfasında değil özel veri sayfalarında depolanır. Bunun en büyük avantajı varchar ile çalışan çoğu dizilim operasyon fonksiyonunun aynı zamanda varchar (max) ile de çalışmasıdır; bununla birlikte ilave işlevsellik için birkaç yeni fonksiyon bulunmaktadır. Aşağıdaki komut farklı karakter dizilimi veri türlerini kullanan dört alanlı bir tablo yaratır:
Create tableContacts(ContactId char(8), |
Microsoft Sql Server 2005 non-ASCII karakter setleri kullanan Unicode datayı depolamak için dört karakter veri türüne sahiptir. Bunlar char, varchar, varchar (max) ve metin veri türlerine eşdeğerdir ve aşağıdaki gibi adlandırılırlar:
* nchar
* nvarchar
* nvarchar(max)
* ntext
Bu yeni veri türleri ile eski veri türleri arasındaki fark; yeni veri türlerinin karakter başına 2 byte kaplayan Unicode karakterlerini tutabilmeleridir. Bu nedenle, depolayabildikleri maksimum dizilim uzunluğu, eski veri türlerindekinin yarısıdır. (4,000 for nchar and nvarchar).
Aşağıdaki ifade önceki örnekteki ile aynı tabloyu yaratır ancak Unicode veri türlerini kullanır.
go |
insert into Contacts_2 (Contactld, Name, Note, Resume)values (NCO-92- |
* National char
* National char varying
* National char varying (max)
* National text
Not
Belirgin olarak, N önekini sabitlerde kullanmaktan kaçınmanız sorun değildir. SQL Server dizilimleri otomatik olarak Unicode eşdeğerine çevirir. Tabii ki Unicode sütunları ve değişkenleriyle uğraşırken N eklemek daha iyidir ancak eklememek de büyük bir sorun yaratmaz. Sadece CPU kendiliğinden gerçekleştirilecek bu çevirme işlemi için ekstra devre yapmak durumunda kalacaktır.
Bununla birlikte N eklememenin probleme dönüşeceği durumlar da bulunmaktadır. Dizilim sabitiniz sorgu ölçütlerin parçasıysa bu durumda N önekinin varlığı sorgulamanın uygulanışını belirgin ölçüde etkileyecektir. Eğer sütun non-Unicode olarak tanımlanmış ve ölçüt N ön ekiyle belirtilmişse SQL Server tablonun her sırasını Unicode sabitiyle karşılaştırmak için değiştirecektir. Sonuç olarak sorgulama, indexi kullanmak yerine tablo taraması yapacaktır.
Tarih Ve Saat Veri Türleri
SQL Server tarih ve saati depolamak için iki T-SQL veri türünü destekler:
* datetime
* smalldatetime
Bu iki veri türü arasındaki fark kapladıkları alandır; datetime 8 byte, smalldatetime sadece 4 byte kullanır. Aralarındaki diğer farklar ise depolanan tarihin doğruluğu/kesinliği ve kullanılabilecek tarihlerin genişliğidir. Smalldatetimeın doğruluğu bir dakikadır ve 1 Ocak 1900den 6 Haziran 2079a kadar olan zamanı kapsar ki bu da yeterinden fazladır. Datetimeın doğruluğu 3.33 milisaniyedir ve 1 Ocak 1753ten 31 Aralık 9999a kadar olan süreyi kapsar.
Tarih ve saat sabitleri, karakter diziliminde olduğu gibi Transact-SQLde kota sınırlamalarıyla yazılır:
SQL Server bir çok değişik tarih ve saat formatını desteklemektedir. Convert fonksiyonu tarih ve saat fonksiyonlarının formatını kontrol eden bir parametre kabul eder.
Eğer bir sabitte zaman belirtilmemişse SQL Server otomatik varsayılan değer olarak geceyarısı 00:00ı atar. SQL Serverın saati bu veri türlerinin bir parçası olarak kaydettiğini aklınızda bulundurmalısınız. Bu nedenle özel tek bir günde doğmuş kontaktlarınızı seçmek isterseniz aşağıdaki gibi bir şey kullanmamalısınız:
select * from Contacts_2 where DateOfBirth >= 2/21/1965 and DateOfBirth =< 2/22/1965 |
SQL Server 1-, 2-, 4-, and 8-byte tamsayıları destekler. Bit veri türü mantıksal doğru ve yanlış değerleri temsil eden 1 ve 0 depolamak için kullanılır. Aşağıdaki tablo tamsayı veri türlerini, depolama boyutlarını ve değerlerin aralığını listeler:
Data Type | Storage Size | Minimum | Maximum |
int | 4 bytes | -2, 147, 483, 648 (-2G) | s2, 147, 483, 647(26?1) |
smallint | 2 bytes | -32768 (-32Ks) | 32767 (32K-1) |
tinyint | 1 bytes | 0 | 255(28-1) |
bigint | 8 bytes | -9,223,372,036,854,775,808 (-263) | 9,223,372,036,854,775,807 (263-1) |
bit | 1 bit | 0 | 1 |
Not
Depolama (warehousing) sistemleri giderek büyüyor ve aynı zamanda iki milyardan fazla tamsayı kullanabilen dağıtımı yapılmış database uygulamaları/yürütmeleri de bulunmaktadır. Bu durumlarda ana anahtar olarak bigint kullanabilirsiniz.
Tamsayı sabitleri sınırlayıcıya gereksinim duymaz:
Ondalık sayılar genellikle tek veya çift kesinlik (single and double precision) olarak da bilinen real ve float veri türlerinde depolanır. Fazla yer kaplamamaları ve geniş aralıkta sayıları tutabilmeleri avantajdır. Tek sorun şudur ki; kati/kesin değillerdir. Yaklaşık olarak orijinal ondalık sayıya eşdeğer yaklaşık/tahmini ama kesin olamayan sayının çift değişkenli temsilini depolarlar.
Kesinlik/Doğruluk (Precision) numaradaki önemli/karakteristik basamak/hanelerin sayısı ve Scale ondalık noktanın sağa doğru uzanan basamak/hanelerin sayısıdır. Örneğin; 123456.789 sayısının 9 doğruluğu ve 3 scalei vardır. Gerçek sayıların basamakları 7ye kadardır ve float sayıların precisionı 15 basamağa kadardır. Bu nedenle, Dünya ve Ay arasındaki mesafeyi ölçerken birkaç metrenin önemsenmeyeceği bilim ve mühendislik için idealdirler. Fakat şirket bütçesinin son kuruşuna kadar kesin olması gereken finansal endüstri için yeterli değillerdir.
Matematikte 234,000,000,000 sayısını kaydetmek için 234xl09 ve Transact-SQLde 234E9 kullanabilirsiniz. Bu, Scientific Notation (Bilimsel İşaretleme) olarak bilinir. Eden sonraki sayı exponent (kuvvet), Eden önceki sayı mantissa (logaritmanın ondalık kısmı) olarak adlandırılır. Bu işaretleme küçük sabitleri depolamak için de kullanılır. Matematikte 0.000000000234, 0.234x109 olarak yazılabilir ve Transact-SQLde 0.234E-9 olarak yazılabilir.
SQL Server bu sayıları depolamak için IEEE 754 standartını kullanır. Float veya gerçek bir değişken ve sütun bir sayıya atandığı zaman SQL Server önce ondalık sayıyı onun çift değişkenli temsiline çevirir. Bu çevirme işlemi , bu değerlerin ondalık versiyona eşitliğinde kesin değil yaklaşık olmasına sebeptir. Bu nedenle Yaklaşık Sayılar (approximate numbers) olarak anılırlar. Bu yüzden bu tarz iki sayı arasındaki dengeye güvenmemelisiniz. Kullanımlarını Where clauses to < and > operatörlerinde sınırlandırmalı ve = operatörünün kullanımından kaçınmalısınız.
Exact Numbers Ondalık veya sayısal veri türleri sayıları depolarken yaklaşıklık/tahmini kullanmazlar. Ne yazık ki gerçek ve float veri türlerine göre daha fazla yer/alan gerektirirler. Ondalık bir sütun veya değişken tanımlandığında/belirtildiğinde basamağını ve doğruluğunu (scale and precision) belirtmelisiniz.
SQL Server maximum 38 doğruluktaki sayıları depolayabilir. Basamak (scale) doğruluktan daha az ya da onunla eşit olabilir.
Aşağıdaki örnekte ağırlık ve yükseklik sütunlarının precisionı 5, scalei 2dir. Sütunlar ondalık noktadan sonra 2 basamağa kadar ve ondalık noktadan önce 3 basamağa kadar olabilir.
Money and smallmoney veri türleri ondalık sayıların precionları ve küçük boyuttaki gerçek sayılar arasındaki uzlaşma/orta yoldur. Smallmoney 4 byte kaplar ve int sayılar gibi aynı dahili yapıyı kullanır. Veri ondalık noktadan sonra dört basamağa kadar olabilir. Bu nedenle --214,768.3648 ile 214,768.3647 aralığındaki sayıları smallmoney veri türünde depolayabilirsiniz. The Money veri türü bilgiyi yerleştirme için the bigint veri türüyle aynı yapıyı kullanır. Depolama için 8 byte kullanır, o yüzden değerleri -922,337,203,685,477.5808 ile +922,337,203,685,477.5807 arasında olmalıdır.
Parasal sabitler den önce $ veya diğer 18 para sembolünden biri gelebilir (SQL Server Books OnLineda listelenmişlerdir):
Binary veri tipleri bitlerin diziliminin yerleştirilmesi için kullanılır. SQL Server dört temel çift değişkenli veri tipini, karakter veri türü ile benzer nitelikleri desteklemektedir:
* binary
* varbinary
* varbinary(max)
* image
Binary and varbinary veri türleri 8,000 byte bilgi ve resim, varbinary (max) 2 GB veri depolayabilir. Aşağıdaki iki çift değişkenli tablo örneği bulunmaktadır:
CREATE TABLE MyTable ( |
uniqueidentifier : Uniqueidentifier veri tipi 16 byte çift değişkenli değer depolar. Bu değerler genellikle globally unique identifiers (GUIDs) olarak anılırlar. Sistem yeni bir GUIDs değer oluşturduğunda aynı değerin ne aynı bilgisayarda ne de dünyadaki herhangi başka bir bilgisayarda tekrar üretilemeyeceği garantidir. GUIDs network kartının kimlik numarasını ve bilgisayarın saatinden elde edilen eşsiz bir numara kullanarak oluşturulur. Network kartlarının yapımcıları network kartı kimlik numarasının gelecek 100 yılda tekrarlanmayacağını garanti ederler.
Uniqueidentifier sabiti genellikle aşağıdaki gibi sunulur;
* Character string {}
* Binary constant Oxaf16a66f7f8b31d3b41d30c04fc96f46
Yine de bu tarz değerleri çok nadir gireceksiniz. Transact-SQLde GUIDs, NEWID fonksiyonu kullanarak oluşturulmalıdır. Aynı zamanda bir client uygulamanın GUID değer üretmek için kullanabileceği Win32 API fonksiyonu bulunmaktadır.
uniqueidentifier değerler web uygulamaları ve dağıtılmış database sistemleri için sık sık kullanılır. Web uygulamalarında, tasarımcılar kayıt databasee gönderilmeden önce eşi olmayan bir tanıtıcı/kimlik oluşturmak için uniqueidentifier veri tipini kullanabilirler. Distributed sistemlerde ise bu veri türü eşi olmayan tanıtıcı/kimliklere hizmet eder.
Aynı zamanda kullanıcının XQuery dilinde xml sütundaki dataya karşı sorgulama yapması için de faydalıdır. (örneğin, belirgin özellik/sembol ve elementlerde belli özel değerleri olan XML dökümanlar içeren dizileri bulmak için). Xml sütunları, özelliklerini ve elementlerini indexleyebilmek çok heyecan verici, böylece makine tablo ve sütun taramaları yapmak zorunda değil.
Bununla birlikte, ilave özelliklerden başka, xml veri türü varchar (max) veri türüne dayanmaktadır ve bu yüzden 2 GB limiti vardır. Aşağıdaki örnekte xml sütunlu bir table yaratılmaktadır:
Değişken objeler iki değer kaydederler:
* Gerçek değer (the actual value)
* Değişkeni tanımlayan metadata (The metadata describing the variant): base veri type, maximum size, scale, precision, and collation
Aşağıdaki ifade farklı türlerde değerler yerleştiren bir lookup table oluşturmaktadır:
Aşağıda bir sütuna değerlerin farklı türlerini nasıl yerleştireceğiniz canlandırılıyor:
* text
* ntext
* image
* varchar(max)
* nvarchar (max)
* varbinary (max)
* timestamp
* sql_variant
* any user-defined veri types
Ancak kullanımlarında daha ciddi kısıtlamalar bulunmaktadır:
* sql_variant columns 8,016 byte ile sınırlıdır.
Sql değişken sütunları eğer anahtardaki datanın toplam uzunluğu 900 bytetan kısa ise indexlerde ve unique anahtarlarda kullanılabilir. Bununla birlikte bu, sql_variant veri tipinin sınırlaması değildir. Indexler toplamda 900 bytetan büyük olan sütunlar üzerine dayandırılamaz.
* sql_variant columns kimlik mülkiyetine sahip olamazlar.
* sql_variant columns hesaplanmış sütunların parçası olamazlar.
* sql_variant objectsten diğer veri tipi objelerine değer atarken veri türlerini convert etmek için fonksiyonları kullanmalısınız.
* sql_variant değerleri karşılaştırmasının karmaşık kuralları vardır ve errorlere eğilimlidirler.
* OLE DB Provider for SQL Server 7.0 kullanan client uygulamalar ile veya SQL Server ODBC Driver from SQL Server 7.0 ile giriş yapıldığında sql_variant değerleri otomatik olarak nvarchara (4000) çevrilir. SQL Server sadece ilk 4,000 karakteri raporlayacaktır.
* SQL Server ODBC Driver from SQL Server 6.5 veya önceki versiyonları ile DB-Library kullanan client uygulamalar ile giriş yapıldığında sql_variant değerleri otomatik olarak nvarchara (255) çevrilir. Eğer depolanan değerler 255 karakterden uzunsa SQL Server sadece ilk 255 karakteri raporlayacaktır.
* Sql_variant sütunlar Like doğrulamada desteklenmez.
* sql_variant sütunlar full metin indexleri desteklemez.
* sql_variant objects, depolanan değerler dizili veta numeric olsa bile + operator kullanarak sıralanamaz. Uygun çözüm sıralamadan önce değerleri dönüştürmektir.
* Bazı fonksiyonlar -Avg(), Identity(), IsNumeric(), Power(), Radians(), Round(), Sign(), StDev(), StDevP(), Sum(), Var(), VarP() - sql_variant parametrelerini desteklemez.
Not
sql_variant veri türünü kullanırken oldukça dikkatli olmalısınız. Kullanımı ciddi performans ve tasarım uygulamaları içermektedir.
table : table veri türü sonraki süreçlerde recordset yerleştirmek için kullanılır. Bazı açılardan bu veri türü geçici tablo (temporary table) ile benzerdir. Bu veri türünü sütun tanımlamak için kullanamazsınız. Sadece fonksiyonun değerini geri döndürmek için local değişken olarak kullanılabilir.
Bu, imleçe dair referanslar içeren özel bir veri türüdür. İmleçler kayıtlar üzerinde operasyona izin veren yapılar programlıyor. Bu türden bir sütun tanımlamak mümkün değildir. Bu sadece değişkenler ve depolanmış prosedür output değerler için kullanılabilir.
Transact-SQL Kullanıcı Tanımlı Veri Türleri
Veritabanında klasik veri tipleri tanımlayabilirsiniz. Geleneksel kullanıcı tanımlı veri türleri Transact-SQL de tanımlanır.
SQL Server 2005te kullanıcı tanımlı veri türlerini .NET te tanımlamak da mümkündür. Bu yeni türler sistem tanımlı veri türüne dayanır ve sadece tanımlandıkları databaseden erişilebilirler. Onları Enterprise Managerdan veya sistem tanımlı procedure sp_addtype kullanarak tanımlayabilirsiniz:
Yeni türler timestamp haricindeki herhangi bir sistem tanımlı türe dayandırılabilir.
Not
Kullanıcı tanımlı veri türlerinin büyüleyici bir özelliği ; database içinden tek bir adımla değiştirebilmenizdir. Örneğin; 19,6 ondalık sayısının sizin parasal değerleriniz için yeterince büyük olmadığına karar verdiniz, bunu 2 8,13 ondalık sayısıyla değiştirebilirsiniz. Veri tipini ilk değiştiren scripti çalıştırıp ardından onu referans gösteren tüm database objectlerini yeniden yaratabilirsiniz. Bu özellik databasein gelişim aşaması boyunca oldukça faydalıdır. Ne yazık ki bir database halihazırda üretim aşamasındaysa, tablolar veri içerir ve bu özellik çok daha karmaşık hale gelir.
Microsoft SQL Server tasarımcıları serverla birlikte özel bir veri türü dahil ettiler: sysname. Transact-SQL tanıtıcılarının (identifier) uzunluğunun kontrolü için kullanılır. Server default moda çalıştığında bu türün uzunluğu 128 karaktere ayarlanır. Uyumluluk seviyesi 65 veya 60a ayarlandığında uzunluk 30 karaktere çekilir/kısaltılır. Bunu Transact-SQL tanıtıcıları içerecek sütun ve değişkenleri tanımlayacağınız zaman kullanmalısınız.http://www.csharpnedir.com/articles/read/?id=681
Hiç yorum yok:
Yorum Gönder