SQL'de Doğru Veri Tipi Nasıl Seçilir? Sayı, Metin ve Tarih Tipleri İçin Karar Rehberi
Beceri rehberi

SQL'de Doğru Veri Tipi Nasıl Seçilir? Sayı, Metin ve Tarih Tipleri İçin Karar Rehberi

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

Veri tipi, bir sütunun hangi değerleri, ne kadar hassasiyetle ve hangi bedelle saklayacağını belirler. Yanlış tip, yuvarlama hatasından yavaş sorguya kadar uzanan sorunların sessiz kaynağıdır.

Bir bakışta

  1. Tip, sütunun sözleşmesidir. Hangi değerin kabul edileceğini, nasıl karşılaştırılacağını ve ne kadar yer tutacağını tip belirler.
  2. Para ve kesin hesaplar için kesin sayısal tip kullanın. DECIMAL kesin, FLOAT ise yaklaşık değer saklar; para tutarını FLOAT'ta tutmak yuvarlama hatası davet eder.
  3. Tarihi tarih tipinde, sayıyı sayı tipinde saklayın. Her şeyi metin yapmak sıralamayı, karşılaştırmayı ve doğrulamayı bozar.
  4. Aralığa uygun en dar tipi seçin. Gereğinden geniş tip yer ve bellek harcar; gereğinden dar tip ise değerleri taşırır.

Veri tipi neden bu kadar önemli?

Microsoft belgesinin tanımıyla, SQL Server'daki her sütunun, yerel değişkenin, ifadenin ve parametrenin bir veri tipi vardır. Tip, nesnenin tutabileceği veriyi belirler: tam sayı, karakter, parasal değer, tarih ve saat, ikili metin ve benzerleri. Bu bir saklama kararı gibi görünür, ama etkisi çok daha geniştir.

Etkisi birkaç alanda hissedilir. Birincisi doğruluk: yanlış tip, değeri sessizce yuvarlayabilir ya da taşırabilir. İkincisi performans: gereğinden geniş tipler daha çok yer ve bellek tutar, tablo ve indeks büyür, sorgular daha çok okuma yapar. Üçüncüsü bakım: tarihi metin olarak saklarsanız hatalı biçimleri veritabanı reddetmez, sıralama alfabetik yapılır ve raporlar bozulur.

Belge ayrıca farklı tipteki iki ifade bir işleçle birleştiğinde sonucun tipini veri tipi önceliği kurallarının belirlediğini söyler. Yani yanlış tipler yalnızca saklamada değil, hesapta ve karşılaştırmada da etki eder. Bu yüzden tip seçimi tablo tasarımının ilk, sonradan değiştirmesi en zahmetli adımlarından biridir.

Tür kategorileri: genel harita

Microsoft belgesi tipleri şu kategorilerde toplar: kesin sayısallar, yaklaşık sayısallar, tarih ve saat, karakter dizileri, Unicode karakter dizileri, ikili diziler ve diğer tipler.

Kesin sayısallar tinyint, smallint, int ve bigint tam sayılarını, bit mantıksal değerini, decimal ve numeric ondalıklarını ve money ile smallmoney parasal tiplerini içerir. Belge decimal ile numeric'in aynı olduğunu açıkça belirtir. Yaklaşık sayısallar float ve real'dir. Tarih ve saat grubunda date, time, datetime2, datetimeoffset, datetime ve smalldatetime bulunur. Karakter dizileri char, varchar ve text; Unicode karşılıkları nchar, nvarchar ve ntext'tir. Diğer tipler arasında uniqueidentifier, xml, json ve rowversion gibi özel amaçlı olanlar yer alır.

Bu listeden günlük işte çoğunlukla küçük bir alt küme kullanılır.

Sayısal tip: kesin mi, yaklaşık mı, hangi aralık?

Sayısal tip seçmek şu sorulara iner. Birincisi: değer tam saklanmalı mı? Para tutarı, vergi ve oran gibi kesin hesap gerektiren değerler için kesin sayısal tipler (DECIMAL) kullanılır. Ölçüm sonuçları, bilimsel hesaplar ya da yaklaşık değer yeterli olduğunda FLOAT ve REAL uygundur. Yaklaşık tipler, bazı ondalık sayıları tam gösteremez; toplamlar küçük sapmalar taşıyabilir. Bu yüzden FLOAT sütunlarda tutarları eşitlik koşuluyla karşılaştırmak ya da parasal toplam almak riskli bir alışkanlıktır.

İkincisi: aralık. Sayma, kimlik ve adet gibi tam sayılar için tinyint, smallint, int ve bigint aralıkları farklıdır. Değerin hiçbir zaman büyüyemeyeceğini biliyorsanız dar tip yeterlidir; sıra numarası veya satır kimliği gibi çok büyüyebilecek değerler için geniş tipi baştan seçmek, sonradan taşma ve tip değiştirme sorunundan kurtarır.

CREATE TABLE siparis ( siparis_id INT NOT NULL, musteri_adi NVARCHAR(100) NOT NULL, siparis_tarihi DATE NOT NULL, kayit_zamani DATETIME2 NOT NULL, tutar DECIMAL(18,2) NOT NULL, indirim_orani DECIMAL(5,4) NOT NULL, onaylandi BIT NOT NULL );

Bu tabloda her sütun için tip bilinçle seçilmiştir: tutar kesin ve ondalıklıdır, oran daha ince bir ondalık hassasiyete sahiptir, evet ya da hayır bilgisi BIT'tir. DECIMAL'de ilk sayı toplam basamağı, ikincisi ondalık basamağı belirler.

Şekil 1

Değerin doğası, tipi belirler

Kesinlik ve aralık ayrı soruları doğurur

Saklayacağınız değer nasıl bir değer?
  1. Para, vergi ya da oran gibi kesin hesaplanan değerDECIMALKesin sayısal; basamak sayısını siz belirlersiniz
  2. Ölçüm ya da bilimsel hesap, yaklaşık değer yeterliFLOATYaklaşık sayısal; eşitlik karşılaştırmasından kaçının
  3. Sayma, kimlik ya da adet gibi tam sayıINT ya da BIGINTDeğerin büyüyebileceği aralığa göre seçin
  4. Evet ya da hayır bilgisiBITMantıksal değer için ayrı tip vardır
Kaynak: Kaynak: Microsoft Learn, Veri tipleri (Transact-SQL)Mindset Institute

Metin tipi: CHAR, VARCHAR ve Unicode

Metin için temel ayrım şu eksenlerde yapılır. Birincisi sabit mi değişken uzunluk mu: CHAR sabit uzunlukludur, VARCHAR değişken. Çoğu metin değişken uzunlukludur ve VARCHAR doğal seçimdir; sabit uzunluklu CHAR, kodlar gibi her zaman aynı uzunlukta olan değerlere uygundur. Ayrıntılı karşılaştırma için CHAR ve VARCHAR rehberine bakın.

İkincisi Unicode olup olmadığı: NCHAR ve NVARCHAR, farklı dillerin karakterlerini saklayabilir; CHAR ve VARCHAR ise belirli bir karakter kümesine bağlıdır. Müşteri adı, adres ya da açıklama gibi serbest metinler, çok dilli veri ya da hangi karakterlerin geleceğinden emin olmadığınız durumlar için Unicode tipler güvenli tercihtir. Türkçe karakter sorunları ayrıca sıralama kuralı (collation) ile ilgilidir; bu konu için ilgili rehbere bakın.

Uzun metinler için belge, varchar(max) ve nvarchar(max) tiplerini büyük değer tipleri olarak, text, ntext ve image tiplerini ise büyük nesne tipleri olarak sınıflar. Yeni tablolarda uzun metin için genellikle (max) tipleri tercih edilir. Uzunluğu gereğinden fazla geniş bırakmak ise başka bir tuzaktır: her sütunu en geniş tipe çekmek, bellek ve indeks maliyetini artırır.

Son bir kural: sayıları ve tarihleri metin sütununda tutmayın. Telefon numarası ya da posta kodu gibi hesap yapılmayan, baştaki sıfırı koruması gereken değerler metin olabilir; ama sipariş tutarı ya da adet metin olmamalıdır.

Tarih ve saat tipleri

Tarih ve saat grubu ilk bakışta kalabalıktır: date yalnızca tarihi, time yalnızca saati, datetime2 tarihle saati birlikte, datetimeoffset ise saat dilimi farkıyla birlikte tutar. datetime ve smalldatetime ise daha eski tiplerdir. Seçim, hangi bilgiye ihtiyacınız olduğuna bağlıdır.

Yalnızca günü önemsiyorsanız (sipariş tarihi, doğum tarihi) DATE yeterli ve temizdir. Olayın zaman damgasını (kayıt zamanı, işlem anı) saklıyorsanız DATETIME2 doğal seçimdir. Farklı saat dilimlerinden gelen olayları karşılaştırıyorsanız saat dilimi bilgisini taşıyan tip gerekir; yoksa bir verinin hangi ana denk geldiği belirsiz kalır.

Tarihi metin olarak saklamak bu grupta en sık yapılan hatadır. Metin olarak saklanan bir tarihte ay-gün sıralaması karışabilir, geçersiz tarihler (aylarda olmayan günler) kabul edilir ve aralık sorguları 'önceki tarih' mantığını kullanamaz; metin sıralaması tarih sıralamasıyla çakışmaz. Doğru tip, doğrulamayı veritabanına bırakır.

Tarih aralığı filtrelemesi ve tarih fonksiyonları için ilgili rehberler vardır; burada önemli olan, doğru tipi seçerek bu işlevlerin güvenle çalışmasını sağlamaktır.

Sık hatalar ve yanlış seçimin bedeli

  • Para tutarını FLOAT'ta saklamak. Yaklaşık tip, kuruş düzeyinde sapmalar ve eşitlik karşılaştırmalarında sürprizler üretir.
  • Tarihi veya sayıyı metin olarak saklamak. Sıralama, filtreleme ve doğrulama bozulur; sorgularda sürekli dönüşüm gerekir.
  • Her sütunu en geniş tipe çekmek. Tablolar ve indeksler büyür, sorgular daha çok okur.
  • Gereğinden dar tip seçmek. Değer büyüyünce taşma hatası ya da kesilmiş veri görülür; büyük tabloda tipi sonradan değiştirmek zahmetlidir.
  • Örtük dönüşümleri görmemek. Farklı tipteki iki ifade karşılaştırıldığında motor birini diğerine çevirir; belge sonuç tipini veri tipi önceliğine göre belirlediğini söyler. Sütunun tipiyle karşılaştırdığınız değerin tipi uyuşmuyorsa çoğu durumda indeksin kullanımı etkilenebilir; bunu yürütme planında kontrol edin.
  • Türkçe metni Unicode olmayan tiplerde saklarken karakter sorunu yaşamak. Emin değilseniz Unicode tipleri tercih edin.
  • BIT yerine metin ile 'E' ya da 'H' saklamak. Mantıksal bilgi için ayrı tip varken kendi gösteriminizi icat etmeyin.

Bir tasarım denetimi için tablonuzun her sütununa şunu sorun: bu değerin gerçekte aldığı aralık, kesinlik ve anlam nedir ve bu tip bunu karşılıyor mu?

Şekil 2

Doğru tip, doğrulamayı ve karşılaştırmayı veritabanına bırakır

Sık yapılan
Doğrusu
Tarihi metin olarak saklamak
DATE ya da DATETIME2 kullanmak
Tutarı FLOAT'ta tutmak
Kesin sayısal tip olan DECIMAL kullanmak
Evet ya da hayırı metinle göstermek
Mantıksal bilgi için BIT kullanmak
Her sütuna en geniş tipi vermek
Aralığa uygun en dar tipi seçmek
Kaynak: Sayfa içeriğiMindset Institute

Tip seçimini Mindset programlarında nerede çalışırsınız?

Veri tipi kararı, tablo tasarımının merkezindedir. SQL ile Programlama Eğitimi, veritabanı tasarlama, tablo oluşturma, boş değerlere izin verme ve kimlik alanları gibi konuları ayrı derslerde işler; tiplerin gerçek bir tablo tanımında nasıl seçildiğini bu zeminde görürsünüz.

Veritabanı Yönetim Sistemleri ve Uygulamaları programı veri modelleme ve tasarım modülünü, Veritabanı Tasarımı ve Normalizasyon programı ise bütünlük kısıtları ve veri kalitesi modülünü kapsar. Sütun tiplerini ve kısıtları birlikte düşünmek isteyen analist, geliştirici ve veri mühendisleri için bu programlar birbirini tamamlar; kapsam ayrıntısı program sayfalarındadır.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

DECIMAL ile FLOAT arasındaki fark nedir?

DECIMAL kesin sayısal bir tiptir; değeri belirlediğiniz basamak sayısıyla tam saklar. FLOAT yaklaşık sayısaldır ve bazı ondalık sayıları tam gösteremez. Para, vergi ve oran gibi kesin hesaplar için DECIMAL, ölçüm ve bilimsel hesap gibi yaklaşık değerin yeterli olduğu durumlar için FLOAT uygundur.

VARCHAR mı NVARCHAR mı seçmeliyim?

Metinde farklı dillerin karakterleri geçebiliyorsa ya da hangi karakterlerin geleceğinden emin değilseniz NVARCHAR, yani Unicode tip, güvenli seçimdir. Yalnızca sınırlı ve bilinen karakterlerden oluşan kodlar için VARCHAR yeterlidir. İkisi arasındaki depolama farkı ve ayrıntılar CHAR ve VARCHAR karşılaştırma rehberinde ve collation rehberinde anlatılır.

Tarih için DATE mi DATETIME2 mi kullanmalıyım?

Yalnızca günü önemsiyorsanız, örneğin sipariş ya da doğum tarihi için, DATE yeterli ve sadedir. Olayın anını da saklıyorsanız (kayıt ya da işlem zamanı) DATETIME2 uygundur. Farklı saat dilimlerinden gelen olayları karşılaştırıyorsanız saat dilimi farkını taşıyan datetimeoffset tipi gerekir.

Bir sütunun veri tipini sonradan değiştirmek kolay mı?

Küçük bir tabloda genellikle mümkündür, ama büyük tabloda tabloyu yeniden yazmayı, indeksleri ve ilişkileri yeniden düzenlemeyi gerektirebilir; dönüşüm sırasında veri kaybı ya da hata olasılığı da vardır. Bu yüzden tipi tasarım aşamasında dikkatle seçmek, sonradan değiştirmekten ucuzdur. Değişiklik gerekiyorsa önce yedek alıp yan ortamda deneyin.

Farklı tipli iki değeri karşılaştırırsam ne olur?

Motor, veri tipi önceliği kurallarına göre iki ifadeden birini diğerinin tipine dönüştürür ve sonucun tipini bu kurallar belirler. Dönüşüm sütun tarafında gerçekleşirse indeks verimli kullanılamayabilir. Bu yüzden sütunun tipiyle karşılaştırdığınız değerin tipini eşleştirin ve yürütme planında örtük dönüşüm uyarılarını kontrol edin.

SQL Veri Tipleri: Doğru Tipi Seçmenin Yolu