CategoryMySQL

MySQL BINARY Kullanımı

Bildiğiniz gibi MySQL veritabanında MSSQL’de olduğu gibi CS ve AIkullanı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_idalanı 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

MySQL’de FLOAT limitleri

MySQL tablolarında FLOAT tipinde bir alana length (precision) değeri vermeden oluşturunca rakamları 7 hanede kesiyor. Bunu simüle etmek için aşağıdaki şekilde bir deneme yaptım:

 

DROP TABLE IF EXISTS `float_test`;

CREATE TABLE IF NOT EXISTS `float_test` (
`string_field` varchar(50) NOT NULL,
`float_field` float NOT NULL
) ENGINE=InnoDB;

INSERT INTO float_test (string_field, float_field) VALUES ('1', 1);
INSERT INTO float_test (string_field, float_field) VALUES ('1.2', 1.2);
INSERT INTO float_test (string_field, float_field) VALUES ('1.23', 1.23);
INSERT INTO float_test (string_field, float_field) VALUES ('1.234', 1.234);
INSERT INTO float_test (string_field, float_field) VALUES ('1.2345', 1.2345);
INSERT INTO float_test (string_field, float_field) VALUES ('1.23456', 1.23456);
INSERT INTO float_test (string_field, float_field) VALUES ('1.234567', 1.234567);
INSERT INTO float_test (string_field, float_field) VALUES ('1.2345678', 1.2345678);
INSERT INTO float_test (string_field, float_field) VALUES ('1.23', 1.23);
INSERT INTO float_test (string_field, float_field) VALUES ('12.34', 12.34);
INSERT INTO float_test (string_field, float_field) VALUES ('123.45', 123.45);
INSERT INTO float_test (string_field, float_field) VALUES ('1234.56', 1234.56);
INSERT INTO float_test (string_field, float_field) VALUES ('12345.67', 12345.67);
INSERT INTO float_test (string_field, float_field) VALUES ('123456.78', 123456.78);
INSERT INTO float_test (string_field, float_field) VALUES ('1234567.89', 1234567.89);

SELECT * FROM float_test;

ve sonuç aşağıdaki gibi çıktı:

+--------------+-------------+
| string_field | float_field |
+--------------+-------------+
| 1            |           1 |
| 1.2          |         1.2 |
| 1.23         |        1.23 |
| 1.234        |       1.234 |
| 1.2345       |      1.2345 |
| 1.23456      |     1.23456 |
| 1.234567     |     1.23457 |
| 1.2345678    |     1.23457 |
| 1.23         |        1.23 |
| 12.34        |       12.34 |
| 123.45       |      123.45 |
| 1234.56      |     1234.56 |
| 12345.67     |     12345.7 |
| 123456.78    |      123457 |
| 1234567.89   |     1234570 |
+--------------+-------------+