MySQL Collation Değişimi

logo-mysql logo-mysql   {right}Collation: Alfabetik sıralama.

Collation Seçimi: (Bizim örneğimizde) veritabanındaki bilgilerin, hangi sıralama algoritması kullanarak sıralama yapacağımızı ayarladığımız veritabanı metadatası.

MySQL’de collation, char, text, longtext gibi metin girilen sahaların hangi algoritmaya göre sıralanacağını belirler. Collation, metinleri tuttuğunuz karakter seti (charset) ve kullandığınız dile göre seçilmelidir.

Bugün fark ettiğim önemli bir problem, charset olarak utf8_general_ci seçildiğinde, Türkçe karakterlerin çengeli olmayan karakterler ile bir tutularak sıralanması idi.

Örneğin MySQL, bir sorgu yaptığımda sıralamayı aşağıdaki gibi yapıyordu:

  1. Şaban
  2. Salih
  3. Sema
  4. Şeyda
  5. Şıh
  6. Sincap

veya

  1. Camış
  2. Çilek
  3. Cumhuriyet

Kısacası, Ş ve S, Ç ve C, I ve İ aynı karakter olarak alınmaktaydı. Böyle bir problem ilk defa başıma geldi.

Çözüm bariz sırıtıyordu: Collation’u utf8_turkish_ci yapmak. Ama nasıl? Onlarca tablo, yüzlerce saha! Tek tek yapılır mı? Olacak şey değil.

Ben de kâh İnternet’ten araştırarak, kâh kendim kafa patlatarak, bir veritabanının tüm tablolarının ve tüm tabloların bütün sahalarının collationlarını değiştiren bir PHP-SQL scripti yazdım.

Acil durumda siz de yararlanabilirsiniz:

[rawr] ```php <?php

/* http://www.ubenzer.com */ $host = "localhost"; $user = "DB KULLANICI ADI"; $pass = "DB KULLANICI PAROLASI"; $database = "VERITABANI ADI";

$donusturulecek_collation = "utf8_turkish_ci"; $donusturulecek_charset = "utf8";

$db = mysql_connect($host, $user, $pass); if(!$db) { die("Baglanti hatasi."); } mysql_select_db($database); $result = mysql_query('show tables'); while($tables = mysql_fetch_array($result)) { foreach ($tables as $key => $value) { mysql_query("ALTER TABLE $value COLLATE $donusturulecek_collation"); mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET $donusturulecek_charset COLLATE $donusturulecek_collation"); } } mysql_query("ALTER DATABASE $db DEFAULT CHARACTER SET $donusturulecek_charset COLLATE $donusturulecek_collation");

echo "Tamamdir yegenim. 😃"; /* http://www.ubenzer.com */ ?>