PostgreSQL Sayısal Veri Türleri Nelerdir?

Selamlar. Bu yazıda size PostgreSQL Sayısal Veri Türleri hakkında bilgi vereceğim. Bir önceki yazı karakter türleri hakkındaydı. Ebru yazıların devam etmesini istediğini belirtti. Mutlu olduğumu belirterek başlayayım.

PostgreSQL Sayısal Veri Türleri

PostgreSQL Sayısal Veri Türleri

Arkadaşlar bildiğimiz gibi programlama dilleri ve veri tabanları veri türlerine sahip olabiliyorlar. Tam kesinlikle söylemeyişimin nedeni NoSQL hakkında bilgi sahibi olmayışım. Bunlar direkt net türlere sahipler mi bilmiyorum. Ancak ilişkisel veri tabanlarının verilerin tutarlı olması açısından türlere sahip olduğu bir gerçek. Peki PostgreSQL bu işte ne durumda?

Açıkcası çok büyük farklar yok. Hemen hemen aynı türler olmakla beraber bazı farklılıkları da göreceğiz. PostgreSQL temelde iki farklı sayısal veri türüne sahiptir. Bu türler;

  • Integer
  • Floating-point

Buradan anlayacak olursak sayısal ve ondalıklı ya da diğer bilinen adıyla kayan noktalı sayılar temel olarak sunuluyor. Bu türler kendi arasında alt dallara sahip olduğu için PostgreSQL Sayısal Veri Türleri ile ilgili konuşmaya başlamadan önce farklılıklarını da açıklamamız gerekiyor. Önceliğimiz Integer üzerine olsun.

Integer Veri Türü

PostgreSQL integer veri türünden üç farklı yapıyı karşımıza çıkarıyor. Boyutsal olarak bahsetmeyeceğim ancak bunları bir şekilde internette bulabilirsiniz. Integer türü kapsamında PostgreSQL tarafında bizlere sunulan türler şunlardır:

  • Small Integer
  • Integer
  • Bigint
  • Serial

Bu türler amaçlarına göre kullanılabilir durumdadırlar. Büyük işlemler için small integer tercih etmeyebilirsiniz. Detaylarına gireceğim ama ön bilgilendirme yapayım. Bu kısımda merak edilen noktalardan birisi otomatik artışın gerçekleştiği kolonla alakalı olabiliyor. Integer ve Serial türler farklı şekillerde bu isteğinizi karşılıyorlar. StackOverflow Based Developer olan bizler hangisinin önerildiğini araştırıp görebiliriz.

Small Integer

Bu veri türü signed integer olarak geçer. Toplamda kapladığı alan 2 byte kadardır. Basit bir örneğini tablo oluşturarak yapalım. CREATE ve INSERT ifadelerini birlikte vereceğim.

CREATE TABLE smallintornek(
    id SERIAL,
    sayi SMALLINT
);

-- Ekleme

INSERT INTO smallintornek(sayi) VALUES(32767);

Eğer maksimum değeri aşan bir sayısal değer girerseniz “ERROR: smallint out of range” hatasıyla karşı karşıya kalırsınız.

Integer Veri Türü

Arkadaşlar bu veri türü hemen hemen tüm veri tabanlarında ve programlama dillerinde aynı mantık üzerine kurulu. Bellekte kapladığı 4 bytelık alanla birlikte en çok tercih edilen türlerden birisidir. Bunun nedeni ise aralık açısından tatminkar bir değere sahip olması. Bu türü diğer veri tabanlarından bildiğini düşünüyorum ama basit olarak sadece tablosunun oluşturulmasını göstereceğim. Zira insert komutu zorluk olmaktan çıkmış olmalı.

CREATE TABLE intornek(
    id SERIAL,
    yas INT NOT NULL CHECK(yas > 0),
    kisi INTEGER NOT NULL CHECK(kisi > 100)
);

INT ve INTEGER aynı şeylerdir. Kısaltma olayı var sadece. Yukarıdaki kodlarda yer alan CHECK ise diğer databaseleri biliyorsanız eğer check constraint olayıdır. Örneğin yukarıdaki örnekte veri girişi belirli bir şarta bağlanmıştır. Yaş kolonu değer alırken değerin sıfır rakamından büyük olup olmadığını kontrol eder. Aynı şekilde kişi sayısının tutulacağı kolon ise 100 sayısından fazla bir değer olup olmadığı ile ilgilenir. Normalde insert vermeyecektim ancak bir örnekle şartı sağlayamadığımızda ne olacağını görelim:

INSERT INTO intornek(yas, kisi) VALUES(-1, 101);

Eğer şart dışında bir şey denersek “ERROR: new row for relation “intornek” violates check constraint “intornek_yas_check“” hatasını alırız.

BigInt Veri Türü

Bu veri türünde tablo oluşturmayı anlatmayacağım. Ancak söylenene göre çok fazla performans sorunlarına yol açıyormuş. Eğer siz harikulade altın oran sayınızı burada saklamayı düşünmüyorsanız hava olsun diye kullanmayın.

Serial Veri Türü

Arkadaşlar bu veri türü integer türlerle aynıdır.  Tabi bazı farkları da olacak ki var oluşunun nedeni Dostoyevski tarafından sorgulanmasın. Integer türden farklı olarak burada otomatik artış için ekstra bir efor harcamanıza gerek kalmıyor. Serial türü ile bir kolon oluşturduğunuzda bazı işlemler gerçekleşecektir:

Sequence object denilen bir nesne oluşturulur

Varsayılan değer bir sonraki değer olarak tanımlanır

NOT NULL eklemesini gerçekleştirir çünkü Serial daima dolu bir türle tanımlanmalıdır

Kullanımı şöyledir:

CREATE TABLE serialornek(
    id SERIAL
);

Auto Increment İşlemleri

PostgreSQL Sayısal Veri Türleri konusunda hem serial hem de integer türünü gördük. Serial türlerin otomatik bir şekilde auto increment gerçekleştirdiğini de biliyoruz ve not null şeklinde bir checking gerçekleştirdiğini de biliyoruz. Bu işlemlerde serial şart mı bu bir zorunluluk mu?

Cevap hayır arkadaşlar. Dilersek bu işlemleri integer ile gerçekleştirebiliriz. Örneğin şöyle:

create sequence ornek_auto_sirasi;

create table ornekauto(
    id integer NOT NULL DEFAULT nextval('ornek_auto_sirasi'),
    ad varchar(20)
);

insert into ornekauto(ad) values('Ali') ;
insert into ornekauto(ad) values('Onur');

Yukarıdaki kod öncelikle “ornek_auto_sirasi” adında bir sıra hazırlar. Bir dizi düşünün içi boş ve doldurulmaya hazır. Bir sequence oluşturarak auto increment kolon için ilk adımı attık. Ardından id alanını integer olarak belirtirken bu kolona boş geçilemez olduğunu tanımladık. En önemli nokta ise DEFAULT anahtar kelimesi ile bu kolonun varsayılan değerinin bir sonraki değer olduğunu tanımladık.

Burada nextval() fonksiyonuna sıra adını belirtmemizin nedeni birden fazla sıranın bir tabloda çalışabileceğini biliyor olmamız. Örneğin ornekauto isimli tabloda 20 kolon olsa ve 20 kolon için ayrı ayrı sequenceler oluşturulsa hangisinin olduğunu nasıl bilecektik? Ve dahası bu sırayı başka bir tabloda da kullanabiliyoruz.

Floating-Point (Kayan Noktalı) Sayılar

PostgreSQL Sayısal Veri Türleri konusunda en zor anlattığım başlık bu başlık oldu ve şu çeviriyi ilk kim yapmışsa toplumda büyük etkiye sahip olmalı. Baksanıza yeni çeviri aramaya üşenmişiz. Arkadaşlar bu noktalı sayılar bildiğiniz gibi 3.14, 90.15, 10,25 şeklinde ifade edilen sayılardan oluşmaktadır. Bu bölümde float türüne göreceğiz. Float ve double türleri arasındaki farkın ise bazı programlama dillerinde float 32 bit double 64 bit şeklinde gösterildiğini söyleyebiliriz.

PostgreSQL kesirli sayılar için üç ana tipte veri türünü bize sunar bunlar şunlardır:

  • float(n)
  • real
  • float8
  • numeric
  • numeric(p, s)

Burada bazı türler size yeni galiba bu dedirtiyor olabilir. Basitçe inceleyelim:

float(n)

Buradaki n artık sayısal bir değerdir diyebiliriz. Vereceğiniz n değeri float kolonun virgülden sonra n karakter saklayabileceğini ifade edecektir. Eğer direkt 1 gibi bir veri girişinde bulunmadıysanız girdiğiniz herhangi bir tür virgülden sonraki 8 basamağı önünüze sunacaktır. Tablosunu oluşturalım ve örnek bir data ile sonuna bakalım:

create table floatornek(
    id SERIAL,
    hassas FLOAT(8)
);

insert into floatornek(hassas) VALUES(1.2);

Bu değerin sonucu inanılmaz görünebilir: 1.20000005. Demek istediğim 8 karakter olayı böyle oluyor yani. Insert ederken bir karakter sınırlaması bulunmuyor ayrıca.

real ya da float8 veri türü

Bu veri türleri çift hassasiyete sahip olup boyut olarka 8 bytetır. Açıkcası çok fazla işim olmadığı için şöyle böyle diyemiyorum. Gelin bir tablo oluşturalım:

create table realornek(
    id SERIAL,
    gercek REAL
);

numeric ya da numeric(p, s) Veri Türü

Bu veri türü önemli sayılabilir. Double-precision için kullanılan veri türlerindendir arkadaşlar. Varsayılan parametresiz bir numeric kolon virgülden önce 131072 basamağa sahip oluyormuş. Virgülden sonra da bu değer 16383 olarak tanımlanmış ki bu muazzam. Ama tabi gereksiz kullanımdan da kaçınarak bu işi bi parça daha şartlı hale getirebiliriz. Örnek virgülden önce 5 sonra 10 karakter hassasiyet oluşsun diyebiliriz. Tablo oluşturalım:

create table numericornek(
    id SERIAL,
    numara numeric(10, 5)
);

-- doğru veri ekleme

insert into numericornek(numara) VALUES(10.2);

Örneğin yukarıdaki kuralı ihlal eden bir ekleme yapalım:

insert into numericornek(numara) VALUES(999999.999991);

Bu işlem sonrasında “A field with precision 10, scale 5 must round to an absolute value less than 10^5.” hatasını alırız. Bunun nedeni toplamda 10 sayısal değer girmeniz gerekiyorken siz kalkıp 12 adet rakam giriyorsunuz.

Evet arkadaşlar bu yazı PostgreSQL Sayısal Veri Türleri ile alakalı bir yazı oldu ama biraz uzun oldu. Yazıya başladığımda saat 21.30 falandı şu an 23.30. Sonlara doğru belki ortalara doğru dengeyi sağlayamamış olabilirim ancak çoğu noktayı anladığımızı düşünüyorum.