Metin verileri ile çalışırken genellikle çeşitli diller ve alfabelerin desteklenmesi gerekmektedir. Bunun için SQL'de sıralama kuralları — COLLATION kullanılır. COLLATION, dizelerin nasıl karşılaştırıldığını ve sıralandığını belirler. Dil özellikleriyle (örneğin, ё ≠ е) doğru bir şekilde çalışabilmek için, COLLATION'ı sütun, tablo veya sorgu düzeyinde doğru bir şekilde tanımlamak önemlidir.
SELECT * FROM users ORDER BY username COLLATE 'ru_RU.UTF8';
Bu sorgu, kullanıcıları Rus alfabesine göre sıralar. Farklı DBMS'lerde COLLATION sentaksı değişiklik gösterebilir.
COLLATE utf8mb4_unicode_ci veya utf8mb4_ru_0900_as_cs (büyük/küçük harf duyarlılığı ve dili dikkate almak için).COLLATE Cyrillic_General_CS_AS — Rusça desteği, büyük/küçük harf farkı (CS = büyük/küçük harf duyarlı, AS = aksan duyarlı).Önemli: COLLATION, sıralama kadar arama (LIKE, karşılaştırmalar) üzerinde de etkilidir!
Aynı sorguda farklı COLLATION'a sahip dizeleri sıralarken hangi sorunlarla karşılaşılır ve açık dönüşümler olmadan farklı sıralama kurallarına sahip verileri bir araya getirmek mümkün müdür?
HATA: COLLATION farklı olduğunda (örneğin, bir sütun için — utf8mb4_unicode_ci, diğerinde — utf8mb4_bin), UNION yapmaya veya doğrudan karşılaştırmaya çalışırken COLLATION uyumsuzluk hatası fırlatılır.
Doğru: Her zaman dizeleri tek bir COLLATION'a dönüştürün COLLATE yapısı aracılığıyla.
SELECT name COLLATE 'utf8mb4_unicode_ci' FROM customers UNION SELECT name COLLATE 'utf8mb4_unicode_ci' FROM suppliers;
Hikaye 1
Büyük bir e-ticaret platformunda, Rusça isimlerin Excel’e aktarımında 'Ё' ile başlayan kullanıcıların listenin en sonuna, 'Е' ile başlayanların ise en başına yerleştirildiği fark edildi. Bunun nedeni COLLATION farklılığıydı — standart Latin kullanılmıştı, Rusça değil ve sıralama alışılmış alfabetik düzene uymuyordu. Kullanıcılar, belirsiz sıralamadan şikayetçiydi.
Hikaye 2
Tıbbi bir sistemde farklı tablolar, farklı COLLATION'a sahip string alanları (varsayılan ve açıkça belirtilmiş Rusça) içeriyordu. Tablo şeması değiştikten sonra, toplu raporlar çalışmamaya başladı, sorgu "COLLATION conflict" hatası vermeye başladı. Destek ekibi, yüzlerce sorguda açıkça COLLATE belirtmek zorunda kaldı.
Hikaye 3
Soy isimle arama yapan API, yalnızca büyük ve küçük harflerin tam yazımıyla çalışıyordu (case sensitive), oysaki kullanıcılar büyük/küçük harf duyarsızlığı bekliyordu. Görüldü ki, sütun *_CS ile oluşturulmuştu, bu da aramanın büyük/küçük harf duyarlı olmasına neden oluyordu. *_CI (case insensitive) olarak düzeltildi, bu da sorunu çözdü.