En yaygın yaklaşım, arama dizesini ve verileri küçük veya büyük harf olarak belirlemektir. Ancak bununla ilgili iki sorun var.
- İngilizce çalışır, ancak tüm dillerde çalışmaz. (Çoğu dilde bile olmayabilir.) Her küçük harf karşılık gelen bir büyük harf içermez; her büyük harf karşılık gelen küçük harf içermez.
- Lower () ve upper () gibi işlevleri kullanmak size sıralı bir tarama sağlar. Dizin kullanamaz. Test sistemimde, less () kullanmak, dizin kullanabilen bir sorgudan yaklaşık 2000 kat daha uzun sürer. (Test verilerinin 100 binden fazla satırı vardır.)
Daha etkili olabilecek en az üç daha az kullanılan çözüm vardır.
- Büyük / küçük harf duyarsız bir veri türünün davranışını taklit eden citext modülünü kullanın . Bu modülü yükledikten sonra, büyük / küçük harfe duyarlı olmayan bir dizin oluşturabilirsiniz
CREATE INDEX ON groups (name::citext);
. (Ama aşağıya bakınız.)
- Büyük / küçük harfe duyarlı olmayan bir harmanlama kullanın. Bu, bir veritabanı başlattığınızda ayarlanır. Büyük / küçük harfe duyarlı olmayan bir harmanlama kullanmak, istemci kodundan hemen hemen her formatı kabul edebileceğiniz anlamına gelir ve yine de faydalı sonuçlar döndürürsünüz. (Ayrıca büyük / küçük harfe duyarlı sorgular yapamayacağınız anlamına gelir.
- İşlevsel bir dizin oluşturun. Düğmesini kullanarak küçük harfli bir dizin oluşturun
CREATE
INDEX ON groups (LOWER(name));
. Sorgular gibi olan dizine yararlanabilir, Bunu yaptıktan sonra SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, ya SELECT id FROM groups WHERE LOWER(name) = 'administrator';
Yapmalisin hatırlamıyorum gerçi, düşük () kullanmak.
Citext modülü, büyük / küçük harfe duyarlı olmayan bir veri türü sağlamaz. Bunun yerine, her bir dize küçük harfli gibi davranır. Yani, lower()
yukarıdaki 3 numaralı gibi her bir dizgeyi çağırmışsınız gibi davranır . Avantajı, programcıların küçük harf dizilerini hatırlamak zorunda olmamalarıdır. Ancak, citext kullanmaya karar vermeden önce dokümanlardaki "Dize Karşılaştırma Davranışı" ve "Sınırlamalar" bölümlerini okumanız gerekir.