38 SQL Büyük/Küçük harf duyarlılığı
38.1 SQL Anahtar kelimeleri
SQL anahtar kelimeleri, SELECT, FROM, WHERE.., büyük küçük harf duyarlı değildir. Aşağıdaki 2 sorgu aynı şekilde çalışır. Ama diğer kelimelerden ayırmak için SQL anahtar kelimelerini tümüyle büyük harf ile yazmanız tavsiye edilir.
SELECT * FROM Customer;
select * from Customer;
38.2 Veritabanı nesne isimleri
Kullanıdığınız veri tabanına göre bu değişir. Örneğin, aşağıdaki 4 sorgu, SQLite ve SQL-Server veritabanlarında çalışır.
SELECT * FROM customer;
SELECT * FROM CUSTOMER;
SELECT * FROM Customer;
SELECT * FROM CuStOmEr;
Ama Oracle veri tabanında bu sorgular aşağıdaki hatayı verirler.
SQL Error [942] [42000]: ORA-00942: table or view does not exist Error position: line: 4 pos: 14
Oracle veritabanında aşağıdaki sorguyu deneyelim.
CREATE TABLE TEST1( ID int);
CREATE TABLE test2( ID int);
CREATE TABLE tEsT3( ID int);
DBeaver üstünde tablo listesini yenilersek (refresh) aşağıdaki resimde olduğu gibi 3 yeni tablomuzu görebiliriz.
Gördüğünüz gibi Oracle için TEST, test veya tEsT kullanımı fark etmedi. Tabloları oluştururken hepsini büyük harf ile oluşturdu. Aynı şekilde bu tablolara SELECT sorgu yapmak istersek,
SELECT * FROM test1;
SELECT * FROM test2;
SELECT * FROM test3;
SELECT * FROM TEST1;
SELECT * FROM TEST2;
SELECT * FROM TEST3;
Oracle bu şekilde oluşturulmuş tablolarda büyük veya küçük harf ile sorgulamamıza izin verir. Türkçe karakter ı,I bu kullanımda sorun oluşturabilir.
Peki neden daha önce hata alıyorduk. Oracle üstünde tablo veya nesne isimlerinin tümüyle büyük ve tümüyle küçük harf dönüşmesini ““ karakterleri kullanarak önleyebiliriz. Örneğin aşağıdaki tablo isminin tam verildiği gibi oluşturulacaktır.
CREATE TABLE "tEsT4"( "Id" int);
Ve bu tabloyu sorgularken yine oluşturulduğu gibi sorgulamamız gerekir.
SELECT * FROM "tEsT4";
Bu derste kullanılan Chinook veritabanı DLL betiklerine bakılırsa, bu veritabanındaki nesnelerin hepsi “” ile oluşturulmuştur. Bunda dolayı dersimizin örnek veritabanında sorguları çalıştırırken tüm nesneler “” arasında kullanılmalıdır. Aşağıdaki örneğe bakınız.
SELECT c."FirstName",c."LastName" FROM "Customer" c ;
38.3 Betik (String) karşılaştırmaları
Veritabanında kullanılan karakter kodlaması (character encoding) ve veritabanı harmanlama ayarlarına (collation settings) göre, bu sorgular büyük küçük harf duyarlılığı ayarlanabilir.
Oracle ve SQLite WHERE büyük/küçük harf duyarlıdır. Aşağıdaki sorgulardan sadece ikincisi sonuç getirir. SQL-Server’da aşağıdaki 2 sorguda sonuç getirir.
SELECT * FROM "Customer" c WHERE c."FirstName" = 'daan';
SELECT * FROM "Customer" c WHERE c."FirstName" = 'Daan';
SQL-Server’da harmanlama (collation) bilgisi aşağıdaki sorgu ile bulunabilir. Eğer gelen sonuçta CI varsa bu Case Insenstive, yani büyük küçük harf duyarlı değil anlamına gelir.
SELECT CONVERT (varchar(256), SERVERPROPERTY('collation'));
Oracle’da harmanlama (collation) bilgisi aşağıdaki sorgu ile bulunabilir. Eğer gelen sonuçta CI varsa bu Case Insenstive, yani büyük küçük harf duyarlı değil anlamına gelir.
SELECT SYS_CONTEXT('USERENV','NLS_SORT') FROM dual;
SQLite normalde binary, byte byte karşılaştırma, yapar. Bu harmanlama (collation) değiştirilebilir ve kullanıcı harmanlamaları eklenebilir. Eğer betik karşılaştırmalarınız beklediğiniz sonuçları vermiyorsa ilk kontrol etmeniz gereken veritabanı harmanlama özellikleridir. Bu konuyu ileride daha ayrıntılı olarak her veritabanı için ayrı ayrı inceleyeceğiz.