31 Temmuz 2015 Cuma

Oracle DB ‘de Türkçe Karaktere Göre Sorgulama Problemleri

Oracle'ın Ulusal Dil Desteği (National Language Support-NLS) mimarisi, veri tabanı sorgulamalarında bölgesel dillere has karşılaşılan problemlere çözümler sağlamakta, tüm veritabansal işlemleri yaparken anadile, yerel ayarlara adapte olunmasını sağlamaktadır.
İki yöntemle yerel dile göre sorgu işlemleri yapılabilir.
a)    Aktif session(oturum) için tanımlama yapılarak;

ALTER SESSION SET NLS_COMP=LINGUISTIC;
ALTER SESSION SET NLS_LANGUAGE=’TURKISH’;
ALTER SESSION SET NLS_SORT='XTURKISH';

ile sorgulama yapılan aktif sessionda karşılaştırma, uyarı ve sıralama işlemleri için dili ayarını Türkçe olarak belirlemiş oluruz. NLS_LANGUAGE veritabanının varsayılan dilini    belirtir.

      b) Linguistic(Dilbilimsel) olarak herhangi bir sessionda yapılan sorgulamada, sorgulama anında dinamik olarak dil parametresi belirtilerek; 
NLSSORT ‘un Türkçe karakterler için kullanımı ve genel argümanları aşağıdaki gibidir.
Kullanımı:
NLSSORT(SUTUN_ADI , ´NLS_SORT_XTURKISH´)
ile türkçe karakterilerin sorgunun en sonunda (ASC) ya da en başında (DESC) yer almasını önleyebiliriz.

Söz dizimi:
NLSSORT(char [, 'NLS_SORT = sort[_ai |_ci]' ])

Argümanlar:
char : Sıralanacak bir text ifadesidir.
Sort : Sorguda, Native Language Support olarak tercih edilen olan dildir.
_ai   : Şive, aksan, vurgu duyarsız sorgulama olduğunu belirtir.
_ci   : Harf duyarsız sorgulama olduğunu belirtir.

Örnek datanın hazırlanması;
CREATE TABLE PERSON (ID NUMBER NOT NULL,NAME VARCHAR2(25 BYTE) NOT NULL);
INSERT INTO PERSON(ID,NAME) VALUES(1,'Çağdaş');
INSERT INTO PERSON(ID,NAME) VALUES(2,'İsmail');
INSERT INTO PERSON(ID,NAME) VALUES(3,'Şeyma');
INSERT INTO PERSON(ID,NAME) VALUES(4,'Arif');
INSERT INTO PERSON(ID,NAME) VALUES(5,'Muhammed');
INSERT INTO PERSON(ID,NAME) VALUES(6,'Eymen');

Dil ayarı İngilizce iken;
Sorgu:
SELECT ID,NAME FROM PERSON ORDER BY NAME;
Çıktı:
ID        NAME
4          Arif
6          Eymen
5          Muhammed
1          Çağdaş
2          İsmail
3          Şeyma

Dil ayarı Türkçe olarak belirtilerek sorgulandığında;
Sorgu:
Aşağıdaki üç sorgu şekli de Türkçe karakterlere göre kayıtları sıralama işlemini yapar. Üç sorgunun da çıktısı aynıdır.

SELECT ID,NAME FROM PERSON ORDER BY NLSSORT(NAME,'NLS_SORT=TURKISH');

SELECT ID,NAME FROM PERSON ORDER BY NLSSORT(NAME,'NLS_SORT=XTURKISH') ASC;

SELECT ID,NAME FROM PERSON ORDER BY NLSSORT(NAME,'NLS_LANG=TR');

Çıktı:
ID        NAME
4          Arif
1          Çağdaş
6          Eymen
2          İsmail
5          Muhammed
3          Şeyma


Türkçe karakterleri bozmadan büyük harfe çevirme işlemi için NLS_UPPER kullanılmalıdır;
Kullanımı :
NLS_UPPER(ALAN_ADI, 'NLS_SORT=XTURKISH')
Örnek:
SELECT ID, NLS_UPPER(NAME, 'NLS_SORT = XTURKISH') "UPPER_NAME" FROM PERSON  ORDER BY NLSSORT(NAME,'NLS_SORT=XTURKISH') ASC;
Çıktı:
ID        UPPER_NAME
4          ARİF
1          ÇAĞDAŞ
6          EYMEN
2          İSMAİL
5          MUHAMMED
3          ŞEYMA

Türkçe karakterleri bozmadan küçük harfe çevirme işlemi için  ise NLS_LOWER kullanılmalıdır;

Kullanımı:
NLS_LOWER(ALAN_ADI, 'NLS_SORT=XTURKISH')
Örnek:
SELECT ID, NLS_LOWER(NAME, 'NLS_SORT = XTURKISH') "LOWER_NAME" FROM PERSON  ORDER BY NLSSORT(NAME,'NLS_SORT=XTURKISH') ASC;
Çıktı:
ID        LOWER_NAME
4          arif
1          çağdaş
6          eymen
2          ismail
5          muhammed
3          şeyma

Arama opsiyonlarının olduğu sorgulamalarda da UPPER ve LOWER opsiyonları kullanılabilir;
Örnek:
Türkçe karakterle başlayan yeni bir data ekleyip, iki farklı türde sorgulama yapıp aynı sonucu alıyoruz;
INSERT INTO PERSON(ID,NAME) VALUES(7,'İhsan');

SELECT ID,NAME FROM PERSON WHERE NLS_UPPER(NAME, 'NLS_SORT = XTURKISH') like '%İ%' ORDER BY NLSSORT(NAME,'NLS_SORT=BINARY_AI');

SELECT ID,NAME FROM PERSON WHERE NLS_LOWER(NAME, 'NLS_SORT = XTURKISH') like '%i%' ORDER BY NLSSORT(NAME,'NLS_SORT=BINARY_CI');

Çıktı:
ID        NAME
4          Arif
7          İhsan
2          İsmail

Kaynaklar:




Hiç yorum yok :

Yorum Gönder