SQL'de Veri Türlerine Giriş

JavaScript'ten farklı olarak, SQL'de güçlü yazım vardır. Her tabloda, her sütunun kendi sabit veri türü vardır.

Pek çok veri türü vardır, ancak Java dilinin aksine, tüm durumlar için veri türleri olduğu için çok fazla veri türü vardır. Veritabanları, verilerin boyutuna çok bağlıdır, bu nedenle birçok veri türü birbirinden yalnızca uzunluk olarak farklılık gösterir.

Toplamda, veri türleri 5 gruba ayrılabilir:

  • sayısal türler
  • Dize türleri
  • Tarihleri ​​ve saatleri saklamak için türler
  • Nesneler: genellikle bir bayt koleksiyonu olarak temsil edilir
  • Taşıma : JSON ve XML

Genellikle farklı DBMS'lerin hala kendi veri türleri vardır. Her DBMS'nin kendi uzmanlığı vardır, bu nedenle yeni veri türleri eklemek çok yaygın bir şeydir.

Başka bir şey de, sadece yeni bir veri türü eklemek yeterli değil, onunla çalışacak işlevler eklemeniz ve bu işi rahat ve hızlı hale getirmeniz gerekiyor.

Herhangi bir endüstriyel (kurumsal) DBMS üzerinde çalışıyorsanız, büyük olasılıkla veri türleri ve işlevleriyle uğraşmanız gerekecektir. Bunun için 2-5 iyi kitap okumak gerekecek.

SQL ile tanışmamızın bir parçası olarak, üç ana veri türü grubunu ele alacağız:

  • Sayılar
  • Teller
  • Tarih

SQL'deki Sayısal Türler

SQL'de sayısal türler üç gruba ayrılır:

  • tamsayı türleri
  • Sabit nokta sayıları (sabit ondalık basamak sayısı)
  • Kayan nokta sayıları

Tamsayılarla başlayalım . Sadece 5 tane var ve bunlar bir tabloda açıklanabilir:

# Tip adı Bayt cinsinden uzunluk Java'dan analog En az değer Maksimum değer
1 TINYINT 1 bayt -128 127
2 SMALLINT 2 kısa -32.768 32.767
3 ORTA MINT 3 -8.388.608 8.388.607
4 INT 4 int -2.147.483.648 2.147.483.647
5 BÜYÜK 8 uzun -2 63 2 63-1

Veri türleri Java veri türlerine çok benzer, ancak üç bayt uzunluğunda bir tamsayı türü de vardır. Bu, boyuttan tasarruf etmek için yapılır.

Sonra kayan nokta türleri gelir , tıpkı Java'da olduğu gibi, bunlardan yalnızca ikisi vardır:

# Tip adı Bayt cinsinden uzunluk Java'dan analog En az değer Maksimum değer
1 BATMADAN YÜZMEK 4 batmadan yüzmek -3.40D+38 +1.18D+38
2 ÇİFT 8 çift -1.79D+308 +1.79D+308

Yine, yeni bir şey yok. Her şey Java'daki ile aynı. Bununla birlikte, Java'dan farklı olarak, SQL'in başka bir özel türü vardır, sabit noktalı gerçek sayı. Buna ONDALIK denir.

Tipik olarak bu tür, para miktarlarını depolamak için kullanılır. Bu türün adı yazıldığında, ondan sonra genellikle sayının ondalık noktadan önce ve sonra kaç tane ondalık basamağa sahip olduğu belirtilir. Genel format şöyle görünür:

DECIMAL(total_characters, after_comma)

Ve küçük bir örnek:

salary DECIMAL(5,2)

Maaş sütununun tam sayılar (en fazla 3 ondalık basamak) ve kesirli kısım - 2 ondalık basamak içerebileceğini bu şekilde açıkladık.

DECIMAL türünün desteklediği maksimum karakter sayısı 65'tir.

SQL'de dize türleri

Bir veritabanındaki satırlar iki biçimde saklanabilir:

  • Sabit uzunluklu diziler
  • Değişken uzunlukta dizeler

Sabit uzunluklu dizeler CHAR olarak belirtilir :

CHAR(length)

Sabit uzunluk, bu sütunun tüm değerlerinin kesinlikle sabit sayıda karakter içereceği anlamına gelir.

Sabit uzunluklu bir dize örneği:

country_code CHAR(2)

Değişken uzunluklu dizeler, VARCHAR türü tarafından belirtilir :

VARCHAR(max_length)

Değişken uzunluk, bu sütunun tüm değerlerinin herhangi bir uzunlukta metin içereceği, ancak maksimum uzunluktan fazla olmayacağı anlamına gelir.

Değişken uzunluklu dize örneği:

phone VARCHAR(12)

Sabit uzunluktaki dizilerin çok büyük bir avantajı vardır. İstemci, SQL sunucusundan tablodan 1.000.000'inci satırı kendisine döndürmesini isterse ve tablodaki satırlar sabit uzunluktaysa, satırın uzunluğunu bilerek, ilgili baytları kolayca hesaplayabilirsiniz. sıra.

Değişken uzunluktaki satırlar olması durumunda, istenen satırı tabloda hızlı bir şekilde bulmak mümkün olmayacaktır. ArrayList ve LinkedList'e erişim hızını hatırlayın, burada durum yaklaşık olarak aynı.

Veri türüne bağlı olarak, farklı uzunluklardaki dizelerin bir tabloda nasıl saklanacağını karşılaştıralım.

Astar karakter(4) Saklanacak bayt VARCHAR(4) Saklanacak bayt
'' '' 4 '' 1
'ab' 'ab' 4 'ab' 3
"abcd" "abcd" 4 "abcd" 5
'abcdefgh' "abcd" 4 "abcd" 5

Not. VARCHAR türü, aynı uzunluk için bir bayt daha gerektirir, çünkü dizenin uzunluğunu ek olarak saklaması gerekir.

SQL'de geçici türler

SQL ayrıca tarih ve saatleri saklamak için özel türlere sahiptir. Toplamda beş tür vardır:

# Tip adı Java DateTime API'sinden analog Örnek En az değer Maksimum değer
1 TARİH Yerel Tarih '2022-06-30' "1000-01-01" '9999-12-31'
2 ZAMAN Yerel zaman 'ss:dd:ss[.fraction]' '-838:59:59.000000' '838:59:59.000000'
3 DATETIME LocalDateTime '1000-01-01 00:00:00.000000' '9999-12-31 23:59:59.999999'
4 ZAMAN BİLGİSİ Tarih '1970-01-01 00:00:01.000000' '2038-01-19 03:14:07.999999'
5 YIL 1901 2155

Sorgulardaki tüm veriler, tek tırnak içinde bir dize olarak yazılır. Giriş formatı büyükten küçüğe doğru gider:

  • Yıl
  • Ay
  • Gün
  • Saat
  • Dakika
  • Saniye
  • Saniyenin kesirleri

DATE, TIME ve DATETIME türleri geleneksel olarak Java DateTme API'sindeki türlerin analogları olarak kabul edilebilir: LocalDate, LocalTime, LocalDateTime. Mantık aşağı yukarı aynı.

TIMESTAMP türü, verileri 1970'in başından beri (bir UNIX işletim sistemi standardı) milisaniye cinsinden depolar. Bu formda, Java dilinde Tarih türüne göre depolanırlar.

Ve son olarak 1 byte uzunluğunda olan ve 1 ile 255 arasında değerler depolayan YEAR tipi vardır. Bu nedenle kullanabileceği yıl aralığı 1901-2155'tir. 1900 yılı bu tür tarafından saklanamaz, çünkü 0 değeri bir NULL değerini kodlamak için kullanılır.

Nesneleri SQL'de depolamak

Nesneleri veya çok uzun metinleri saklamak için özel türler vardır. Ayrıntısına girmeyeceğiz ama yine de sıralayayım:

# Tip adı Açıklama
1 METİN Uzun metinleri saklamak için kullanılır. Bu alanda karşılaştırma ve sıralama yapılırken sadece ilk 100 karakter kullanılır.
2 BLOB Ad, Bayt Büyük Nesne anlamına gelir. Yalnızca bir bayt koleksiyonu olarak depolanır. Örneğin resimleri bir veritabanında saklamak için kullanılabilir.
3 CLOB Ad, Char Büyük Nesne anlamına gelir. Uzun metinleri saklamak için kullanılır.
4 SIRALAMA Sabit bir değer kümesi belirlemenizi ve bunlardan birini değer olarak saklamanızı sağlar.
5 AYARLAMAK Sabit bir değer kümesi belirlemenize ve bunların herhangi bir alt kümesini bir değer olarak saklamanıza olanak tanır. Genellikle bunları bir ikili maske olarak saklar.

Teorik olarak, herhangi bir Java nesnesini bir bayt kümesi olarak seri hale getirebilir ve onu bir BLOB olarak veritabanında saklayabilirsiniz. Nesneyi kaydetmek sorun değil. Onunla daha fazla nasıl çalışılır?

Diyelim ki bir tablo milyonlarca nesneyi serileştirilmiş biçimde saklıyor - bunlar arasında nasıl arama yapacaksınız? Bir DBMS, yalnızca belirli bir veri türünü, onunla çalışmak için kapsamlı bir dizi işlev sağladığında destekler.