PostgreSQL'de veri tabanları bazı veri tiplerine sahiptir. Önceki yazımda karakter veri tiplerinden bahsetmiştim. Buradan okuyabilirsiniz. Şimdi de sayısal veri tiplerinden bahsedeceğim.

Öncelikle sayısal veri tipleri üçe ayrılmaktadır:

  • Tamsayı Tipleri
  • Arbitrary Precision Sayılar
  • Floating-Point Tipleri

Neden veri tiplerine ihtiyaç duyarız?

Veri tabanlarındaki her tablo, bu tablolardaki her sütun kendine özgü verilere sahiptir. Bazı tablolarda sayısal değerler tutulurken, bazı tablolarda ise metinsel değerler tutulur. Hepsini birbirinden ayırmak için tablolardaki her sütunun veri tipini belirlememiz gerekir.

Sayısal veri tiplerini ayrı ayrı inceleyelim:

Tam Sayı Tipleri:

Bu veri tipi, adından da anlaşıldığı gibi, yalnızca tam sayı değerlerini kabul eder. Bu tam sayı tipleri, boyutlarına göre üçe ayrılır: integer, smallint, bigint. 

    - "Integer" yani Tam sayı veri tipi en yaygın kullanılan tiptir. Depolama alanı 4 bit, aralığı -2147483648 ile +2147483647 arasındadır. Bu veri tipi depolama alanı, performans ve aralık konusunda en uyumlu olandır. Bu veri tipi, "int4" adında bir alias'a sahiptir.

    - "Smallint" veri tipi, daha küçük veriler için kullanılmaktadır. Depolama alanı 2 bit, aralığı -32768 ile +32767  arasındadır. Bu veri tipi, "int2" adında bir alias'a sahiptir.

    -"Bigint" veri tipi, en büyük alana sahip olan tiptir. Veri alanı yetmediğinde kullanılmak üzere tasarlanmıştır. Fakat veri tabanının performansını düşürmektedir. Depolama alanı 8 bit, aralığı -9223372036854775808 ile +9223372036854775807 arasındadır. Bu veri tipi, "int8" adında bir alias'a sahiptir.

Not: Alias, takma ad anlamına gelir. Genellikle, kullanımı kolaylaştırmak ve akılda kalıcılığı arttırmak için kullanılır. 

Tüm veri tiplerinde olduğu gibi, bunlarda da belirlenen aralığın dışında veri girmeyi değerseniz PostgreSQL hata verecektir. Şimdi örneklerle doğru ve yanlış kullanımları görelim.

"Integer" kullanımı:

İlk olarak, "CREATE TABLE" komutu ile, "deneme" isimli bir tablo oluşturalım. Bu tablomuzun "integer" tipli ve "sayı" isimli bir sütunu olsun. 

Not: "integer" yerine "int" olarak da kullanılır, bir farkı yoktur.

Daha sonra, "INSERT INTO" komutu ile tablomuza "100" diye bir değer girelim. Bu değer, integer'ın aralığının içinde olduğu için hatasız bir şekilde tablomuza eklendi.


Eğer, aşağıdaki örnekteki gibi, ondalık bir sayıyı tablomuza eklemeyi denersek PostgreSQL bunu kabul etmez. Çünkü "integer" veri tipi sadece tam sayıları kabul eder.

Şimdi de, "integer" veri tipinin aralığının dışında veriler girmeyi deneyelim. Aşağıdaki iki örnekte gördüğünüz gibi PostgreSQL bunu kabul etmedi. Çünkü girdiğimiz değerler "integer" veri tipinin aralığının dışındadır.

Son olarak, "SELECT FROM" komutu ile tablomuza eklemeyi denediğimiz değerlerden hangilerinin eklendiğini görebiliriz.

Gördüğümüz gibi, yalnızca "100" değeri tablomuza eklenebildi. Çünkü diğer örneklerdekiler "integer" veri tipine uygun değerler değildi.

"Smallint" kullanımı:

İlk olarak, "CREATE TABLE" komutu ile "deneme2" isimli bir tablo oluşturalım. Bu tablomuzun "sayi" isimli ve "smallint" tipli bir sütunu olsun.

Daha sonra, "INSERT INTO" komutu ile, tablomuza "10" değerini ekleyelim. Bu değer, "smallint" tipine uygun olduğu için, başarılı bir şekilde tablomuza eklendi.

 Aşağıdaki örnekte, "10.4" değeri tam sayı olmadığı için PostgreSQL hata verdi, ve değer tablomuza eklenemedi.

Aşağıdaki iki örnekte, "smallint" tipinin aralığının dışında değerler girmeyi denediğimiz için, PostgreSQL hata verdi, verileri tabloya eklemedi.

Son olarak, hangi verilerin tabloya eklendiğini görmek için "SELECT FROM" komutunu kullanalım. Gördüğünüz gibi sadece "10" değeri tablomuza eklendi.

"Bigint" kullanımı:

Öncelikle, "CREATE TABLE" komutu ile "deneme3" isimli bir tablo oluşturalım. Tablomuzun içinde "sayi" isimli, "bigint" veri tipine sahip bir sütun olsun.


Daha sonra, "INSERT INTO" komutu ile tablomuza veriler girelim. Aşağıdaki iki örnekte de veriler, "bigint" veri tipine uygun olduğu için başarı ile tablomuza eklendi.

 


Aşağıdaki iki örnekte ise, tablomuza veri eklemeye çalıştığımızda PostgreSQL bize hata verdi. Çünkü, bu örneklerdeki sayılar, "bigint" veri tipinin aralığına uygun değildir.

Bu örneğimizde ise, tablomuza eklemek istediğimiz sayı, tam sayı olmadığı için PostgreSQL bize hata verdi. 

Son olarak, yalnızca ilk iki örneğimizdeki sayıların tablomuza eklenebildiğini görebilmek için, "SELECT FROM" komutu ile, tablomuzdaki tüm sütunları çağıralım.

Özetle, küçük veriler saklamak istiyorsak "smallint", orta büyüklükte veriler saklamak istiyorsak "integer" veya diğer adıyla "int" kullanmalıyız. "Integer" veri tipi, küçük boyutlu verileri de kabul eder, yani "smallint" tipinin kabul ettiği sayıyı aslında "integer" tipi de kabul eder. "Bigint" veri tipi ise, "integer" tipinin boyutunun yetmediği yerde kullanılmaktadır. En büyük sayılar için "bigint" tipini kullanmalıyız. Eğer, veriniz "bigint" veri tipinin aralığına da sığmıyorsa, "Decimal(Ondalık)" veri tipini kullanabilirsiniz.

Serial Makrosu:

Serial makrosu, tam sayı sekansı oluşturmak için kullanılır. Genellikle "primary key" olarak belirlenen sütunda kullanılır. Eğer, sütunu "primary key" olarak belirlemezsek, tabloya yapılan eklemelerde, aynı değerden birden fazla olabilir. Sütunun "primary key" olarak belirlenmesi, bu durumu ortadan kaldırır. Yani, "serial" makrosu ile oluşturulan sütunun, "primary key" olarak belirlenmesi, daha verimli bir kullanım olacaktır. Aslında gerçek olmayan, yani "pseudo-types" olarak nitelendirilen üç türü vardır:

   - "Smallserial": Bu türün depolama alanı 2 bit, aralığı 1 ile 32767 arasındadır. Tam sayı veri tipinde, "smallint" e denktir.

   - "Serial": Bu türün depolama alanı 4 bit, aralığı 1 ile 2,147,483,647 arasındadır. Tam sayı veri tipinde, "integer" a denktir.

    -"Bigserial": Bu türün depolama alanı 8 bit, aralığı 922,337,2036,854,775,807 arasındadır. Tam sayı veri tipinde, "bigint" e eşittir.

Aralıklarının değerlerine baktığımızda, "Tam sayı" veri tiplerinin aralıklarının pozitif değerleri, "Seri" makrosunun aralığıyla eşit olduğunu görebilirsiniz. Bu özellik, "Seri" veri makrosunun aslında tam sayı oluşturmak için kullanıldığını kanıtlar niteliktedir.

Kullanımı:

İlk olarak, "CREATE TABLE" komutu ile "ornek" isimli bir tablo oluşturalım. Bu tablomuzda "id" isimli, "serial" makrolu bir sütunumuz olsun. Ayrıca bu sütun tablomuzun "primary key" i olsun. Çünkü, genelde "serial" makrolu sütunlar "primary key" olarak kullanılır. Çünkü, "serial" makrosu her zaman özgün, tek değerlere sahiptir. Tablomuzun diğer sütunu ise "isim" isimli, "varchar" tipli bir "not null" sütun olsun.

Daha sonra, tablomuzla ilgili ayrıntılı bilgi edinmek için "\d" komutunu kullanalım. Aşağıdalki görselde görüldüğü gibi, "serial" olarak oluşturduğumuz sütunun tipi aslında bir "integer", yani tam sayı.

Aşağıda, "INSERT INTO" komutunun normalinden farklı bir kullanımını görmekteyiz. Bu komut, "örnek" tablosunun, "isim" sütununa "seda" değerini eklemektedir.

"SELECT FROM" komutu ile tablomuzu çağırdığımızda tablomuzdaki "id" sütununa biz eklemediğimiz halde "1" değeri eklenmiştir. "Seri" veri tipinin özelliğini burada görmekteyiz.


Tablomuza veri eklemek için bir diğer "INSERT INTO" kullanımı da aşağıdaki gibidir. Bu kullanımda, tabloya "id" sütununa  "DEFAULT"  verisini, "isim" sütununa da "ayse" verisini girmektedir. Buradaki "DEFAULT" un anlamı, sekansa devam eden veriyi girmesidir.

 Tablomuza aşağıdaki şekilde tekrar veri eklenebilir.

Eğer, tablomuza veri girerken aynı zamanda girilen verinin sekansını görmek istersek aşağıdaki komutu kullanabiliriz:

Tablomuzun son hali aşağıdaki gibidir:

Not: Tablodaki "Seri" makrosuna sahip sütunun sekans adını öğrenmek için aşağıdaki komutu kullanabilirsiniz:

Not 2 : Tabloya eklenen son sekans değerini görmek için aşağıdaki komutu kullanabilirsiniz:

Özetle, "Seri" makrosunun amacı, sekanslı bir tam sayı sütunu oluşturmaktır. Birbirini takip eden değerlerden oluşan bir sütun oluşturmak, bu veri tipi ile daha kolaydır.

Arbitrary Precision Sayılar:

Bu veri tipleri, numeric ve decimal, çok büyük basamaklara kadar olan sayıları tutabilmektedir. "numeric" veya "decimal" tipleri birbirine eşittir. Parasal değerlerin saklanması için, genelde bu veri tipinin kullanılması tavsiye edilir. Bu veri tipi ile, matematiksel hesaplamalar da yapılabilmektedir. 

Kullanımını, daha anlaşılır olması için, "floating-point" veri tipi ile birlikte aşağıda görebilirsiniz.

Floating-Point Tipleri:

Bu veri tipleri, real ve double-precision, tamsayı olmayan değişken duyarlıklı veri tipleridir.

Pratikte bu tipler, temel işlemcinin, işletim sisteminin ve derleyicinin bunu desteklediği ölçüde, "ikili floating-point" aritmetiği (sırasıyla "single" ve "double precision") için genellikle IEEE 754. standardı uygulamalarıdır.

PostgreSQL, hatalı sayıları "float" ya da "float(p)" olarak adlandırır. Buradaki "p" değeri, iki basamaklı değerlerde minimum kabul edilebilir değerdir. "Float(1)" ile "float(24)" arasındakiler "real" tiptir. "Float(25)" ile "float(53)" arasındakiler "double-precision" tiptir.

Şimdi bir örnek ile 'Arbitrary Precision' ve 'Floating-Point' tiplerini görelim:

Bu örnekte, "x" değerinin, "numeric", "decimal", "real" ve "double precision" hallerini görüyoruz. "generate_series" komutu, -2.5'ten 2.5'e kadar 1'er artışla bir seri oluşturmaya yarar. "Numeric" tipte sayı en yakın tam sayıya yuvarlanır. Ayrıca, "x" değeri negatifken, sayı negatife; "x" değeri pozitifken, sayı pozitife yuvarlanır . "Decimal" tipteki "x" değerlerinin hepsi, "numeric" tiptekilerle aynı olduğunu görüyoruz .  "Real" ve "double-precision" tipleri, "x" değerini çift sayılara yuvarlarlar. Burada da "real" ile "double-precision" ın aynı olduğunu görüyoruz. 

 

No comments

Add Comment

E-Mail addresses will not be displayed and will only be used for E-Mail notifications.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Standard emoticons like :-) and ;-) are converted to images.
Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.

Submitted comments will be subject to moderation before being displayed.