PostgreSQL Türkçe Arama Sorunu ve Çözümü

Herkese merhaba,
PostgreSQL veritabanında  X bir tabloya Türkçe ifadelerle gönderilen “LIKE” sorgusu arama işlemi sonuç vermemekte.

Bu sorunun çözümü için öncelikle aşağıdaki sorguyu çalıştıralım.

SELECT * FROM pg_collation;

Yukarıda ki sorgudan elde ettiğimiz kolonlardan collcollate kolonunda “tr_TR” ifadesini barındıran satırı bulalım ve bu satırın collname ini alalım,

Fakat her zaman satırlarda “tr_TR” ifadesi bulunamayabilir. Bunun için ;

locale -a

Yukarıdaki kod blogunu veritabanınızın kurulu olduğu sunucunun terminalinde çalıştırın elde ettiğiniz listede “tr_TR” ifadeleri mevcut değilse aşağıdaki sorguları yine sunucu üzerinde çalıştırabilirsiniz.


sudo locale-gen tr_TR
sudo locale-gen tr_TR.UTF-8

sudo update-locale

Daha sonra örneğin iller tablomuzu Türkçe ifadelerle istekte bulunulan LIKE sorgusuna oluşturabilmek için

tr-TR-x-icu Bu ifade bizler için önemli. Veritabanımızda ki string veri aldığımız alanları bu ifade ile oluşturacağız. Örneğin


CREATE  TABLE iller(
  "il_id" int4 NOT NULL DEFAULT nextval('il_seq'),
  "plaka" int4 NOT NULL,
  "il_adi" varchar(100) COLLATE pg_catalog."tr-TR-x-icu" NOT NULL
);
 
INSERT INTO sabitler.iller (il_id,il_adi, plaka) VALUES
(1, 'İSTANBUL', 34),
(2, 'ANKARA', 6),
(3, 'İZMİR', 35),
(4, 'BURSA', 16),
(5, 'ADANA', 1),
(6, 'ADIYAMAN', 2),
(7, 'AFYONKARAHİSAR', 3),
(8, 'AĞRI', 4),
(9, 'AKSARAY', 68),
(10, 'AMASYA', 5),
(11, 'ANTALYA', 7),
(12, 'ARDAHAN', 75),
(13, 'ARTVİN', 8),
(14, 'AYDIN', 9),
(15, 'BALIKESİR', 10),
(16, 'BARTIN', 74),
(17, 'BATMAN', 72),
(18, 'BAYBURT', 69),
(19, 'BİLECİK', 11),
(20, 'BİNGÖL', 12),
(21, 'BİTLİS', 13),
(22, 'BOLU', 14),
(23, 'BURDUR', 15),
(24, 'ÇANAKKALE', 17),
(25, 'ÇANKIRI', 18),
(26, 'ÇORUM', 19),
(27, 'DENİZLİ', 20),
(28, 'DİYARBAKIR', 21),
(29, 'KOCAELİ', 41),
(30, 'KONYA', 42),
(31, 'KÜTAHYA', 43),
(32, 'MALATYA', 44),
(33, 'MANİSA', 45),
(34, 'MARDİN', 47),
(35, 'MERSİN', 33),
(36, 'MUĞLA', 48),
(37, 'MUŞ', 49),
(38, 'NEVŞEHİR', 50),
(39, 'NİĞDE', 51),
(40, 'ORDU', 52),
(41, 'OSMANİYE', 80),
(42, 'RİZE', 53),
(43, 'SAKARYA', 54),
(44, 'SAMSUN', 55),
(45, 'SİİRT', 56),
(46, 'SİNOP', 57),
(47, 'ŞIRNAK', 73),
(48, 'SİVAS', 58),
(49, 'TEKİRDAĞ', 59),
(50, 'TOKAT', 60),
(51, 'TRABZON', 61),
(52, 'TUNCELİ', 62),
(53, 'ŞANLIURFA', 63),
(54, 'UŞAK', 64),
(55, 'VAN', 65),
(56, 'YALOVA', 77),
(57, 'YOZGAT', 66),
(58, 'ZONGULDAK', 67),
(59, 'DÜZCE', 81),
(60, 'EDİRNE', 22),
(61, 'ELAZIĞ', 23),
(62, 'ERZİNCAN', 24),
(63, 'ERZURUM', 25),
(64, 'ESKİŞEHİR', 26),
(65, 'GAZİANTEP', 27),
(66, 'GİRESUN', 28),
(67, 'GÜMÜŞHANE', 29),
(68, 'HAKKARİ', 30),
(69, 'HATAY', 31),
(70, 'IĞDIR', 76),
(71, 'ISPARTA', 32),
(72, 'KAHRAMANMARAŞ', 46),
(73, 'KARABÜK', 78),
(74, 'KARAMAN', 70),
(75, 'KARS', 36),
(76, 'KASTAMONU', 37),
(77, 'KAYSERİ', 38),
(78, 'KİLİS', 79),
(79, 'KIRIKKALE', 71),
(80, 'KIRKLARELİ', 39),
(81, 'KIRŞEHİR', 40);

 select * from sabitler.iller where il_adi LIKE 'İST%'

Yukarıdaki adımlar başarı ile tamamlandığında artık LIKE sorgunuz doğru bir şekilde çalışacak.

Eski PostgreSQL sürümlerinde “-x-icu” bu ifade yer almamaktaydı.

Eğer eski yazılan bloglara denk gelirseniz bu işlemlerin doğru sıralama ile verilip son adımda COLLATE 

ifadesini doğru olarak tanımlayamamaktan meydana gelen hata ile karşılaşıldığı görülecektir.

-x-icu” ifadesiniki ,icu ise (International Components for Unicode (ICU))