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.