“istanbul” = “İSTANBUL” mu?
Bu sorunun cevabını veritabanının harmanlama (collation) ayarı verir. Collation, metinlerin nasıl karşılaştırılacağını ve sıralanacağını belirler: büyük/küçük harf duyarlı mı, aksanlar (â, ç, ş) dikkate alınıyor mu, hangi dilin alfabe sırası kullanılıyor?
| Kısaltma | Anlamı | Örnek |
|---|---|---|
| CI / CS | Case Insensitive / Sensitive: büyük/küçük harf duyarsız / duyarlı | CI'da 'ali' = 'ALİ'? |
| AI / AS | Accent Insensitive / Sensitive: aksan duyarsız / duyarlı | AI'da 'Şahin' = 'Sahin' |
SQL türlerine göre
| SQL türü | Varsayılan davranış | Türkçe için |
|---|---|---|
| SQL Server | Kurulumda seçilir (çoğunlukla CI_AS) | Turkish_CI_AS; sorguda COLLATE Turkish_CI_AS |
| PostgreSQL | Büyük/küçük harf duyarlı | ICU collation (tr-x-icu), duyarsız arama için ILIKE veya LOWER() |
| MySQL | utf8mb4_0900_ai_ci: duyarsız | utf8mb4_turkish_ci |
| Oracle | Duyarlı | NLS_SORT = XTURKISH, NLS_COMP = LINGUISTIC |
| BigQuery | Duyarlı | COLLATE(metin, 'und:ci') |
Türkçe “i” sorunu
Türkçede küçük i'nin büyüğü İ, küçük ı'nın büyüğü I'dır. İngilizce kurallarla UPPER('istanbul') “ISTANBUL” olur; Türkçe kuralla “İSTANBUL”. Collation Türkçe değilse “İSTANBUL” ile “ISTANBUL” farklı görülür ve aramalar kayıt kaçırır.
-- SQL Server: sorguda harmanlama belirtmek SELECT * FROM customers WHERE city = N'istanbul' COLLATE Turkish_CI_AS; -- Türkçe alfabeye göre sıralama (ç, ğ, ı, ö, ş, ü doğru yerde) SELECT name FROM products ORDER BY name COLLATE Turkish_CI_AS; -- PostgreSQL: Türkçe ICU harmanlama SELECT name FROM products ORDER BY name COLLATE "tr-x-icu";
Taşınabilir çözümHarmanlamaya güvenemiyorsan karşılaştırmadan önce iki tarafı da aynı biçime getir: kırp, Türkçe karakterleri sadeleştir (TRANSLATE), büyük harfe çevir. Metin benzerliği dersindeki “anahtar” yöntemi budur.
Indeks uyarısıSütunu
UPPER(city) gibi bir fonksiyona sokmak indeks kullanımını engeller. Sık yapılan aramalar için doğru collation'lı sütun veya normalleştirilmiş ek sütun daha iyidir.