SQL Notları: Karakter Setleri ve Karşılaştırma Kuralları (Collations)

MySQL'de karakter setleri ve karşılaştırma kuralları, veritabanında metin verilerinin nasıl saklanacağını ve nasıl karşılaştırılacağını belirler. Bu yazıda, MySQL'de karakter setleri ve karşılaştırma kurallarının nasıl kullanılacağını, tablo ve sütun düzeyinde nasıl ayarlanacağını ele alacağız.

#### 1. Hangi Karakter Seti ve Karşılaştırma Kuralı Kullanılmalı?

MySQL'de onlarca karakter seti ve yüzlerce karşılaştırma kuralı bulunur. Ancak genellikle sadece birkaç karakter seti önemlidir:

- **ascii**: Temel 7-bit karakterler.
- **latin1**: ASCII artı Batı Avrupa dilleri için gerekli karakterler.
- **utf8**: 1, 2 ve 3 byte'lık UTF-8 karakterlerini içerir. Emoji ve bazı Çince karakterleri içermez.
- **utf8mb4**: Tüm UTF-8 karakterlerini içerir ve tüm dilleri destekler.

**En iyi uygulama:**

- Metin veya `VARCHAR` sütunları için `utf8mb4` kullanın.
- Hex string'ler (UUID, MD5, vb.) ve basit kodlar (ülke kodu, posta kodu, vb.) için `ascii` veya `latin1` kullanın.

#### 2. Tablo ve Sütun Düzeyinde Karakter Seti Ayarlama

Karakter setleri, hem tablo hem de sütun düzeyinde ayarlanabilir. Aşağıdaki örnekte, `Address` tablosu için karakter seti ve sütun düzeyinde ayarlamalar gösterilmiştir:

```sql
CREATE TABLE Address (
   AddressID INTEGER NOT NULL PRIMARY KEY,
   Street VARCHAR(80) CHARACTER SET ASCII,
   City VARCHAR(80),
   Country VARCHAR(80) DEFAULT "United States",
   Active BOOLEAN DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

- **Street**: ASCII karakter seti kullanır.
- **City** ve **Country**: Tablonun varsayılan karakter seti olan `utf8mb4` kullanır.

#### 3. Bağlantı Düzeyinde Karakter Seti Ayarlama

MySQL sunucusuna, istemcinin kullandığı karakter kodlamasını belirtmek önemlidir. Bu, `SET NAMES` komutu ile yapılır:

```sql
SET NAMES utf8mb4;
```

Bu komut, istemcinin `utf8mb4` karakter setini kullandığını MySQL sunucusuna bildirir. Bu, özellikle farklı karakter setleri kullanıldığında veri dönüşümlerini otomatik olarak yönetir.

#### 4. MyISAM'dan InnoDB'ye Dönüştürme

MyISAM ve InnoDB, MySQL'in iki farklı depolama motorudur. InnoDB, işlem desteği ve daha iyi performans sağlar. MyISAM tablolarını InnoDB'ye dönüştürmek için aşağıdaki komut kullanılır:

##### Örnek: Temel Dönüştürme

```sql
ALTER TABLE foo ENGINE=InnoDB;
```

Bu komut, `foo` tablosunu MyISAM'den InnoDB'ye dönüştürür.

##### Örnek: Bir Veritabanındaki Tüm Tabloları Dönüştürme

Bir veritabanındaki tüm MyISAM tablolarını InnoDB'ye dönüştürmek için aşağıdaki SQL sorgusu kullanılır:

```sql
SET @DB_NAME = DATABASE();

SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables
WHERE table_schema = @DB_NAME
 AND ENGINE = 'MyISAM'
 AND TABLE_TYPE = 'BASE TABLE';
```

Bu sorgu, veritabanındaki tüm MyISAM tablolarını InnoDB'ye dönüştürmek için gerekli `ALTER TABLE` komutlarını üretir. Bu komutları kopyalayıp çalıştırabilirsiniz.

#### Sonuç

MySQL'de karakter setleri ve karşılaştırma kuralları, veritabanında metin verilerinin doğru şekilde saklanmasını ve karşılaştırılmasını sağlar. `utf8mb4`, modern uygulamalar için en iyi seçenektir. Ayrıca, MyISAM tablolarını InnoDB'ye dönüştürmek, işlem desteği ve performans avantajları sağlar. Bir sonraki yazıda görüşmek üzere!

Önceki Yazı
SQL Notları: Transactions

MySQL'de işlemler (transactions), bir grup SQL ifadesini tek bir iş birimi ola...

Sonraki Yazı
SQL Notları: ENUM Veri Türü

`ENUM` veri türü, belirli bir değer kümesi içeren sütunlar için kullanı�...