1. KARAKTER NİTELİKLER
CHAR
Belirli sayıdaki karakteri saklamak için kullanılır.
Şayet saklanan değer tanımlanan genişlikten kısa ise, karakter kümesinin sağ tarafına tanımlı genişliğe gelene kadar MySQL tarafından boşluk karakteri eklenir.
Örneğin, CHAR(5) tanımlamasını, bu alanda daima 5 karakter uzunluğundaki değerleri saklamak istediğimizde kullanırız. Şayet bu alana "ABC" karakter kümesi eklenecek olursa veritabanında saklanma şekli "ABC "dir.
VARCHAR
Değişken sayıdaki karakterleri saklamak için kullanılır.
Nitelik tanımlamasında girilen değer saklanacak en büyük karakter uzunluğudur.
MySQL 4.1 belirtimlerine göre bir VARCHAR alan en çok 255 karakter (1 byte=28) saklayabilir, ancak MySQL 5'ten sonra 255 ya da 65535 (2 byte) karakter saklayabilirsiniz.
Şayet tanımlanandan (n olsun) daha uzun bir karakter kümesi girme girişiminde bulunursanız ilk n karakteri veritabanına kaydedilecek geri kalan karakterleri kaybetmiş olacaksınızdır.
2. SAYISAL NİTELİKLER
TINYINT
Belirli genişlikte ikili saklar, her zaman 1 byte'dır.
Yukarıdaki ifadenin pratikteki anlamı tinyint alanda en fazla 255 (28-1) sayının saklanabileceğidir.
Şayet sütunu SIGNED olarak tanımlamışsanız, saklanabilecek en büyük pozitif sayı 127, en küçük negatif sayı da -127 olur; 0(sıfır)'ı da sayarsanız 255 sayı tanımlamış oluruz.
Öte yandan değerlerinizin işaretinin aynı olacağını biliyorsanız, sütunu UNSIGNED yaparak; en büyük pozitif sayı limitini 255'e taşıyabilirsiniz.
SMALLINT
Belirli genişlikte ikili saklar, her zaman 2 byte'dır.
SIGNED özelliği ile saklanabilecek en büyük pozitif sayı , en küçük negatif sayı da -32767.
UNSIGNED olarak en büyük (28*28)-1 = (32767*2)-1 = 65'535 olur.
MEDIUMINT
Belirli genişlikte ikili saklar, her zaman 3 byte'dır.
SIGNED özelliği ile saklanabilecek en büyük pozitif sayı 9'199'871, en küçük negatif sayı da -9'199'871.
UNSIGNED olarak en büyük (28*28*28)-1 = 18'399'743 olur.
INT
Belirli genişlikte ikili saklar, her zaman 4 byte'dır.
SIGNED özelliği ile saklanabilecek en büyük pozitif sayı 2'147'483'647, en küçük negatif sayı da -2'147'483'647.
UNSIGNED olarak en büyük (28*28*28*28)-1 = 4'294'967'295 olur.
BIGINT
Belirli genişlikte ikili saklar, her zaman 8 byte'dır.
Yine benzer şekilde, UNSIGNED olarak (28*28*28*28*28*28*28*28)-1 = 18'446'744'073'709'551'616 sayısı saklanabilir; şayet SIGNED olarak kullanacaksanız da bunun yarısı kadar bir değer tutabilirsiniz.
2. ZAMANSAL NİTELİKLER
DATE
Veritabanında saklanma şekli 3 byte'dır.
Tarih saklamak için kullanılır.
En az etkili (significant) basamak en önce saklanır; yani varsayılan depolama biçimi 'yyyy-aa-gg' dir (y: yıl, a: ay, g:gün)
DATETIME
Veritabanında saklanma şekli 8 byte'dır.
Tarih ve zamanı saklamak için kullanılır.
Varsayılan depolama biçimi 'yyyy-aa-gg SS:dd:ss' dir. (y: yıl, a: ay, g:gün, S: saat, d: dakika, s: saniye)
TIME
Veritabanında saklanma şekli 3 byte'dır.
Zamanı saklamak için kullanılır.
Varsayılan depolama biçimi 'SS:dd:ss' dir. (y: yıl, a: ay, g:gün, S: saat, d: dakika, s: saniye)
TIMESTAMP
Varsayılan depolama şekli 4 byte'dır. Bir UNIX fonksiyonu olan time() fonksiyonu ile aynı işi yapar.
Epoch ismi verilen (00:00:00 UTC, Ocak 1, 1970) tarihinden o ana kadarki zaman uzaklığı saklayabilen bir alandır.
YEAR
UNSIGNED TINYINT gibi saklanır.
Farkı ise YEAR alanının 1901 ötelenmiştir. (YEAR) 0 = 1901 olarak düşünülebilir.
Bazı İpuçları
Veritabanı alanlarınızın niteliklerini tanımlarken, gereksinimlerinizi mutlaka belirleyiniz. Örneğin üye sıra no tutacak bir alan tanımlarken yaklaşık ne kadar üyeniz olacağını düşününüz; 100 kişi civarında bir üye potansiyeli öngörüyorsanız bunun için BIGINT tanımlamayınız, bu ciddi performans israfıdır.
Veritabanında saklayacağınız verileri mutlaka veri tipine uygun tanımlanmış alanlarda saklayınız. Sadece rakamlardan oluşacak bir alanı ya da tarih tipinde bir veriyi asla ve asla VARCHAR tipinde saklamayınız; bu veritabanının sizin veritipine özel sunduğu bir çok güzel özellikten (Sıralama seçeneği esneklikleri gibi) feragat etmektir.
Veritabanında bir işlemin yapılma zamanını girecekseniz,yani o anki zamana ihtiyacınız varsa bunun için PHP kodunuz içinde date() fonksiyonu ile o anki zamanı oluşturup girmenize gerek yoktur, zaten MySQL'de NOW() diye bir fonksiyon vardır, çoğu kişinin farkında olmadığı.
Ve son olarak -kendimi yineliyor gibi olacağım ama- veritabanı tasarımı gerçekten önemli bir iştir, bir uygulama yazmadan veritabanı tasarımına yeterli zamanı ayırınız.