SQL Notları: Veri Türleri ve Depolama

## Veri Türleri ve Depolama

MySQL, farklı türde verileri depolamak için çeşitli veri türleri sunar. Bu veri türleri, verilerin nasıl saklanacağını ve işleneceğini belirler. İşte MySQL’de sıkça kullanılan bazı veri türleri:

### 1. **CHAR(n) ve VARCHAR(n)**

– **CHAR(n)**: Sabit uzunlukta bir string türüdür. `n` karakter uzunluğunda bir alan kaplar. Örneğin, `CHAR(10)` olarak tanımlanan bir sütun, 10 karakterlik bir alan kaplar, içeriği ne olursa olsun.
– **VARCHAR(n)**: Değişken uzunlukta bir string türüdür. `n` karaktere kadar veri depolayabilir, ancak yalnızca kullanılan kadar alan kaplar. Örneğin, `VARCHAR(100)` olarak tanımlanan bir sütun, 100 karaktere kadar veri depolayabilir, ancak yalnızca girilen karakter kadar alan kaplar.

**Örnek Kullanım:**
“`sql
CREATE TABLE users (
   username VARCHAR(50),
   country_code CHAR(2) CHARACTER SET ascii
);
“`

### 2. **DATE, DATETIME, TIMESTAMP, YEAR ve TIME**

– **DATE**: Yalnızca tarih bilgisini depolar. Formatı `YYYY-MM-DD` şeklindedir.
– **DATETIME**: Tarih ve saat bilgisini depolar. Formatı `YYYY-MM-DD HH:MM:SS` şeklindedir.
– **TIMESTAMP**: Tarih ve saat bilgisini depolar, ancak Unix zaman damgası olarak saklar. Formatı `YYYY-MM-DD HH:MM:SS` şeklindedir, ancak aralığı 1970’ten 2038’e kadardır.
– **YEAR**: Yalnızca yıl bilgisini depolar. 1901 ile 2155 arasındaki yılları destekler.
– **TIME**: Yalnızca saat bilgisini depolar. Formatı `HH:MM:SS` şeklindedir.

**Örnek Kullanım:**
“`sql
CREATE TABLE events (
   event_name VARCHAR(100),
   event_date DATE,
   event_time TIME
);
“`

### 3. **INT, FLOAT, DOUBLE ve DECIMAL**

– **INT**: Tam sayı değerlerini depolar. Boyutuna göre `TINYINT`, `SMALLINT`, `MEDIUMINT`, `INT` ve `BIGINT` gibi türleri vardır.
– **FLOAT ve DOUBLE**: Yaklaşık ondalık sayı değerlerini depolar. `FLOAT` 4 byte, `DOUBLE` ise 8 byte yer kaplar.
– **DECIMAL**: Kesin ondalık sayı değerlerini depolar. Para gibi kesinlik gerektiren değerler için idealdir.

**Örnek Kullanım:**
“`sql
CREATE TABLE products (
   product_id INT AUTO_INCREMENT,
   price DECIMAL(10, 2),
   weight FLOAT
);
“`

### 4. **BIT ve BLOB**

– **BIT**: Bit değerlerini depolar. Özellikle bayrak (flag) değerleri için kullanışlıdır.
– **BLOB**: Büyük ikili verileri (binary large objects) depolar. Örneğin, resim veya dosya gibi veriler için kullanılır.

**Örnek Kullanım:**
“`sql
CREATE TABLE images (
   image_id INT AUTO_INCREMENT,
   image_data BLOB
);
“`

## Veri Türleri ve Performans

Veri türlerini seçerken, performans ve depolama gereksinimlerini dikkate almak önemlidir. Örneğin, `VARCHAR` yerine `CHAR` kullanmak, sabit uzunluklu veriler için daha verimli olabilir. Ancak, `VARCHAR` değişken uzunluklu veriler için daha esnektir ve daha az depolama alanı kullanır.

Ayrıca, `TEXT` türleri, büyük metin verileri için kullanışlı olsa da, karmaşık sorgularda performans sorunlarına neden olabilir. Bu nedenle, `VARCHAR` gibi daha küçük veri türleri tercih edilmelidir.

## Otomatik Dönüştürme (Implicit Casting)

MySQL, bazı durumlarda veri türlerini otomatik olarak dönüştürebilir. Örneğin, bir string değeri sayısal bir işlemde kullanıldığında, MySQL bu stringi otomatik olarak sayıya dönüştürebilir:

“`sql
SELECT ‘123’ * 2;  — Sonuç: 246
“`

Ancak, bu tür otomatik dönüştürmeler bazen beklenmeyen sonuçlara yol açabilir. Örneğin:

“`sql
SELECT ‘ABC123’ * 2;  — Sonuç: 0
“`

Bu nedenle, veri türlerini açıkça belirtmek ve otomatik dönüştürmelerden kaçınmak genellikle daha güvenlidir.

Bu bilgilerle, MySQL’deki veri türlerini ve nasıl kullanılacağını daha iyi anlayabilirsiniz. Bir sonraki yazıda, daha gelişmiş SQL sorguları ve performans optimizasyonu konularına değineceğiz.