Ana içeriğe geç
Kesit SQL
Orta · Fonksiyonlar

Harmanlama (collation): büyük/küçük harf ve Türkçe “İ” sorunu

Karşılaştırma ve sıralama kuralları; CI/CS, AI/AS ve Türkçe karakterler.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

“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ısaltmaAnlamıÖrnek
CI / CSCase Insensitive / Sensitive: büyük/küçük harf duyarsız / duyarlıCI'da 'ali' = 'ALİ'?
AI / ASAccent 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 ServerKurulumda seçilir (çoğunlukla CI_AS)Turkish_CI_AS; sorguda COLLATE Turkish_CI_AS
PostgreSQLBüyük/küçük harf duyarlıICU collation (tr-x-icu), duyarsız arama için ILIKE veya LOWER()
MySQLutf8mb4_0900_ai_ci: duyarsızutf8mb4_turkish_ci
OracleDuyarlıNLS_SORT = XTURKISH, NLS_COMP = LINGUISTIC
BigQueryDuyarlı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.
Alıştırmalara geç (7)