Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

16.10.2011

MySQL'in String karşılaştırması

Var olan bir projeye sonradan katıldıysanız ya da proje ekibinizde veritabanı işlerini yöneten bir takım arkadaşınız varsa MySQL'in string karşılaştırmasının nasıl çalıştığı ile ilgili bilginiz olmayabilir. Ve vakit gelip de yeni bir projenin veritabanını oluşturma ihtiyacı duyduğunuzda ve iş başa düştüyse MySQL karakter encoding ve string karşılaştırmayla ilgili anlatacağım bu konu size zaman kazandıracaktır.

MySQL'de nonbinary string tipleri (char, varchar, text) büyük küçük harf ayırmaksızın karşılaştırılır. Örneğin username like 'admin' gibi bir sorgu koşulunda dönen sonuçlar içinde username'i admin, ADmin, ADMIN, vb. olan kayıtlar da getirilecektir.

Böyle bir sonucu engellemek için ya veritabanı oluşturulurken schema tanımının collation tipini ya da sorunu yaşadığınız kolonun collation tipini binary olacak şekilde ayarlamanız gerekiyor:

CREATE DATABASE mobileme CHARACTER SET utf8 COLLATE utf8_bin;

ya da

ALTER TABLE table_name MODIFY username VARCHAR(25) CHARACTER SET utf8 COLLATE utf8_bin;


Varolan schema'da böyle bir sıkıntınız varsa tüm schema'nın collate tipini değiştirmek için aşağıdaki sorgunun ürettiği sorgucukları işletmeniz yeterli:

SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;') as stmt
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = 'schema_name'
ORDER BY 1;