Bildiğiniz gibi MySQL veritabanında MSSQL’de olduğu gibi CS
ve AI
kullanımları yok. Bunun yerine collation verileri hep CI
yani Case Insensitive
olarak kullanılıyor. Bu durumda büyük/küçük harf duyarlı bir sorgu yapmak istediğimiz zaman devreye BINARY
giriyor.
Örneğin basit bir kullanıcı girişi sorgusunu aşağıdaki gibi hepimiz kullanıyoruz;
SELECT * FROM users WHERE user_id = 'canyildiz' AND password = 'hashed_pass';
Ancak biz canyildiz
ve CanYildiz
kullanıcı adları ayrı ayrı kullanılabilsin istersek bunu büyük/küçük harf duyarlı (case-sensitive
) yazabiliyor olmamız gerekiyor. Bunu da aşağıdaki gibi yazıyoruz:
SELECT * FROM users WHERE user_id = BINARY 'canyildiz' AND password = 'hashed_pass';
Bu durumda artık sadece user_id
alanı tam olarak canyildiz
olan kullanıcı satırı ile çalışır olduk.
Burada çok dikkat edilmesi gereken bir konu var; bazı yerlerde BINARY
kullanımı alan adının önünde kullanılarak örneklenmiş. Yani aşağıdaki gibi bir sorgu yazılmış;
SELECT * FROM users WHERE BINARY user_id = 'canyildiz' AND password = 'hashed_pass';
Bu şekilde kullanıldığında ciddi oranda performans sorunu yaratıyor. Ben her iki sorguyu da içinde ~1.2M kayıt olan bir tabloda denedim ve şu şekilde sonuç aldım:
SELECT * FROM users WHERE BINARY user_id = 'canyildiz' AND user_password = 'hashed_pass'; /* Affected rows: 0 Found rows: 1 Duration for 1 query: 2.822 sec. */ SELECT * FROM users WHERE user_id = BINARY 'canyildiz' AND user_password = 'hashed_pass'; /* Affected rows: 0 Found rows: 1 Duration for 1 query: 0.021 sec. */
Sorguları EXPLAIN
ile incelediğimde BINARY user_id
şeklinde olan kullanımda index’lerin kullanılmadığını gördüm