Fibplus Türkçe Karakter Sorunu

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Fibplus Türkçe Karakter Sorunu

Mesaj gönderen adnansirca »

Arkadaşlar Fibplus bileşenleri ile veritabanına bağlanıyorum.
Veritabanı Friebird. Ibexpert ile hazırladım.
Charset Iso8859_1 ayarladığımda veritabanına bağlanabiliyorum ama arama yaparken türkçe karakter sorunu yaşanıyor.
Cahrset türkçe(1254) yaptığımda ise hata veriyor ve hiç bir sonuç elde edemiyorum.
Bu sorunu nasıl çözebilirim.
Teşekkürler.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Fibplus Türkçe Karakter Sorunu

Mesaj gönderen Lost Soul »

charset olarak 'WIN1254 seçmen gerekiyor.
Örnek kod:

Kod: Tümünü seç

Function TTables.BaglanFIBDB(DataBaseName: string):Boolean;
begin
with FIBDB do
    begin
    if Connected then Connected := False;
    DBName                  :=DataBaseName;
    ConnectParams.UserName  :='SYSDBA';
    ConnectParams.Password  :='masterkey';
    ConnectParams.CharSet   :='WIN1254';
    SQLDialect              :=3;
        try
        Connected:=True;
        except on e : Exception do
            Begin
            //Raise Exception.Create
            Showmessage
                ('Veritabanına bağlanılamadı'+#13#10+'Hata:'+#9 + e.Message);
            End; // except on e:Exception do
        end; //try Connected :=True;
    result := Connected;
    end; //With fibdb do
end;
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Re: Fibplus Türkçe Karakter Sorunu

Mesaj gönderen adnansirca »

Lost Soul yazdı:charset olarak 'WIN1254 seçmen gerekiyor.
Dediğinizi yaptım. Ama büyük küçük harf sorunu hala devam ediyor. Veritabanını başka bir projede denedim yine aynı sorunla karşılaştım.

Şimdilik aşağıdaki sekilde kullanıyorum. Sorguda İ kullanınca sonuç vermiyor. Diğer hallerde çalışıyor.

Kod: Tümünü seç

SelectSQL.Add(' AND UPPER(ADI) LIKE UPPER(''%'+cxTEdtadi.Text+'%'')');
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Fibplus Türkçe Karakter Sorunu

Mesaj gönderen sadettinpolat »

http://delphiturkiye.com/forum/viewtopi ... e+pxw_turk

Kod: Tümünü seç

LIKE UPPER(''%'+cxTEdtadi.Text+'%'')')
bu ifadenin karakter seti belli degil , bununda karakter setini fb ye bildirmeniz lazim.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Fibplus Türkçe Karakter Sorunu

Mesaj gönderen White Rose »

arama yaparken
... 'WHERE UPPER(ADI collate pxw_turk) Like ''%'+ansiuppercase(cxTEdtadi.Text)+'%'' şeklinde kulanın
altanbozoglu
Üye
Mesajlar: 5
Kayıt: 26 May 2018 10:09

Re: Fibplus Türkçe Karakter Sorunu

Mesaj gönderen altanbozoglu »

Firebird 3.0 Kullanıyorum.
Türkçe karakter ve arama sorunu yaşayanlar için güncelleme yapmak istiyorum. Veri tabanınızı oluştururken UTF8 olarak oluşturursanız türkçe sıralama hatalarından kurtulursunuz.

Veri tabanı tabloları oluştururken varchar(x) COLLATE UNICODE_CI şeklinde oluşturmanız büyük küçük harf duyarsız ve unicode karakterler içeren string alanlar oluşturabilmeyi sağlar.

Arama yaparken,
select * from KARSILASTIRMA where REPLACE(BUYUKHARF, 'İ', 'I') like REPLACE('%i%','İ','I') Order By BUYUKHARF
şeklinde arama yapmanız içerisinde büyük İ harfi olan verilerin doğru gelmesini sağlar. aşağıda bunu açıklıyorum.

Sıralamada Problemimiz yok çünkü kodlama UTF8 ve COLLATE UNICODE_CI olduğunda Türkçe sıralama doğru çalışıyor.

* UPPER ile yapılan çözümler işe yaramıyor çünkü;
küçük "ı" karakteri "I" karakterine ve küçük "i" karakteri yine "I" karakterine çevriliyor.
Çevrimler her ne kadar mantıklı görünse de, kimse ismail'e ısmail demez.
veri tabanında da Büyük - küçük İ ve I farklı karakterler ve ismail ile İsmail aynı şey olmasına karşın,
ismail ile Ismail farklıdır.

* Son Kullanıcıya İsmaile Ismail gir demek mantıksız çünkü biri büyük giriyor öteki küçük arıyor buna karışma hakkımız yok.
* Programatik olarak Büyük İ girişleri i olarak değiştirmek ve veri tabanına küçük i olarak girmek mantıksız. Çünkü bunları aratmanın dışında raporlama yapıyorsanız tüm raporlarla oynamak gerekiyor.
* Aşağıda bir test tablosu oluşturdum.

/* Test Tablosu */
CREATE TABLE KARSILASTIRMA (
KARSILASTIRMAID INTEGER NOT NULL
,BUYUKHARF VARCHAR(50) COLLATE UNICODE_CI
,KUCUKHARF VARCHAR(50) COLLATE UNICODE_CI
,KULLANIMDA BOOLEAN default TRUE
,CONSTRAINT PK_KARSILASTIRMA PRIMARY KEY (KARSILASTIRMAID)
);

/* Test Datası */
INSERT INTO KARSILASTIRMA VALUES (1,'ALPER','alper',True);
INSERT INTO KARSILASTIRMA VALUES (2,'BARIŞ','barış',True);
INSERT INTO KARSILASTIRMA VALUES (3,'CÜNEYT','cüneyt',True);
INSERT INTO KARSILASTIRMA VALUES (4,'ÇİÇEK','çiçek',True);
INSERT INTO KARSILASTIRMA VALUES (5,'DENİZ','deniz',True);
INSERT INTO KARSILASTIRMA VALUES (6,'EMİNE','emine',True);
INSERT INTO KARSILASTIRMA VALUES (7,'FATMA','fatma',True);
INSERT INTO KARSILASTIRMA VALUES (8,'GAMZE','gamze',True);
INSERT INTO KARSILASTIRMA VALUES (9,'ĞİLEYOK','ğileyok',True);
INSERT INTO KARSILASTIRMA VALUES (10,'HAYDAR','haydar',True);
INSERT INTO KARSILASTIRMA VALUES (11,'IĞDIR','ığdır',True);
INSERT INTO KARSILASTIRMA VALUES (12,'İSMAİL','ismail',True);
INSERT INTO KARSILASTIRMA VALUES (13,'JALE','jale',True);
INSERT INTO KARSILASTIRMA VALUES (14,'KEMAL','kemal',True);
INSERT INTO KARSILASTIRMA VALUES (15,'LEYLA','leyla',True);
INSERT INTO KARSILASTIRMA VALUES (16,'MAHMUT','mahmut',True);
INSERT INTO KARSILASTIRMA VALUES (17,'NAMIK','namık',True);
INSERT INTO KARSILASTIRMA VALUES (18,'OSMAN','osman',True);
INSERT INTO KARSILASTIRMA VALUES (19,'ÖZKAN','özkan',True);
INSERT INTO KARSILASTIRMA VALUES (20,'PINAR','pınar',True);
INSERT INTO KARSILASTIRMA VALUES (21,'RAMİS','ramis',True);
INSERT INTO KARSILASTIRMA VALUES (22,'SERKAN','serkan',True);
INSERT INTO KARSILASTIRMA VALUES (23,'ŞEYDA','şeyda',True);
INSERT INTO KARSILASTIRMA VALUES (24,'TARIK','tarık',True);
INSERT INTO KARSILASTIRMA VALUES (25,'UFUK','ufuk',True);
INSERT INTO KARSILASTIRMA VALUES (26,'ÜZEYİR','üzeyir',True);
INSERT INTO KARSILASTIRMA VALUES (27,'VEDAT','vedat',True);
INSERT INTO KARSILASTIRMA VALUES (28,'YALÇIN','yalçın',True);
INSERT INTO KARSILASTIRMA VALUES (29,'ZAFER','zafer',True);

-- sınama

select * from KARSILASTIRMA

select * from KARSILASTIRMA ORDER By BUYUKHARF
select * from KARSILASTIRMA ORDER By KUCUKHARF

select * from KARSILASTIRMA where BUYUKHARF like '%i%' -- İSMAİL İsmi gelmiyor içerisinde Büyük İ karakteri olan isimlerin hiçbiri yok

select * from KARSILASTIRMA where UPPER(BUYUKHARF) like UPPER('%i%') -- Küçük "i" Harfi Büyük "I" harfine dönüştürülüyor. Eksik Sonuç Dönüyor
-- UPPER fonksiyonlu hiç bir sonucu doğru alamadım
select * from KARSILASTIRMA where BUYUKHARF CONTAINING 'İ' -- İşe yaramıyor
select * from KARSILASTIRMA where BUYUKHARF collate UTF8 Like '%İ%' -- İşe yaramıyor

-- En yakın bulduğum çözüm (aslında tek çözüm)
select * from KARSILASTIRMA where REPLACE(BUYUKHARF, 'İ', 'I') like REPLACE('%i%','İ','I') Order By BUYUKHARF


Saygılar.
Cevapla