MySQL Tablolarının ve Tablo Alanlarının Karakter Setini Topluca Değiştirmek

Yazan: türker | Tarih 2 Nisan 2008 | Yorum  5 Yorum
BerbatKötüOrtaGüzelHarika 3 kez puan verildi, Ortalama: 5 (5 üzerinden)
Loading ... Loading ...

veri tabanı kullanıyorsanız karakter seti tanımlamaları yüzünden zaman zaman sıkıntılı anlar yaşamışsınızdır. Aşağıdaki betik sayesinde bu tür sorunlarınızın ufak bir bölümüne çözüm sağlayabilirsiniz. Betiğin yaptığı iş tanımlanan karakter setini tüm tablolara ve tablo içinde alanlara uygulamaktan ibarettir. Performansını test etmesemde, üçyüzden fazla tablonun ve sayısı birkaç bini geçen tablo alanlarının tamamının karakter setinin değiştirilmesi 15-20 saniye civarında sürmüştür.

Örnek1: Kullanmakta olduğunuz tablolarınız utf8 ve tablolarınızın içindeki alanlar utf8_general_ci olarak tanımlanmış olsun. Bu durumda u ve ü harflerinde sorun çıkaracaktır. Bu sorunu gidermek tüm tabloarı ve tablolardaki alanları utf8_turkish_ci karakter setine geçirmeniz gerekecek. Bu durumda bu betiği kullanabilirsiniz.

Örnek 2: Hazır bir yazılım(wordpress, openads vs.) kurdunuz. Ancak sunucusunun ön tanımlı karakter seti latin1 olduğu için tüm tablolar ve tablo alanları latin1 karakter setinde tanımlanmış oldu. Yazılımı kullanmaya başlamadan önce istediğiniz karakter setiyle(mesela utf8 yada latin5) çalışabilecek hale getirebilirsiniz.(Tabi yazılımın desteklediğini varsayıyorum).

Örnek 3: Hazır bir yazılım kurdunuz, bir süre kullandınız ve veri girdiniz. Ardından karakter setini değiştirmek istediniz, mesela latin5den utf8e geçmek istediniz. Bu betiği kullanırsanız tüm tablolarınız ve tablolarınızın içindeki alanlar istediğiniz karakter setine geçer ancak tablolardaki veriler bozulur. Bu durumdaysanız bu betiği kullanmayınız.

Örneklerden de anlayabileceğiniz gibi, eğer tablolarınızda veri varsa ana karakter setini bu betik ile değiştirebilirsiniz ancak verilerinizin karakter setini bu betik değiştirmez. Fakat ana karakter setini değiştirmeden, alt karakter setleri arasında geçiş yapacaksanız tabloda veri olup olmaması "büyük ihtimalle"(tek tek test edecek vaktim yok maalesef) sorun çıkarmayacaktır.

Her ihtimale karşı betiği kullanmadan önce yedek alın. Yaptığınız değişikliklerden, başarılı veya başarısız farketmez, haberdar ederseniz diğer kullanıcılara faydanız olabilir. Ben utf8_general_ci olarak ayarlı ve içinde veri olan tabloları sorunsuz şekilde utf8_turkish_ci olarak ayarlayabildim.

:
  1. /*
  2. yazan   : turker
  3. e-mail  : turker.biz@gmail.com
  4. version : 0.01
  5. ------------
  6. Üstteki bilgilere dokunmadan, istediğiniz gibi kullanabilir, satabilir ve dağıtabilirsiniz.
  7. */
  8.  
  9. # karakter seti ayarları
  10. $charset='utf8';
  11.  
  12. # bağlantı ayarları
  13. $conn=mysql_connect("localhost","root","") or die('nerdesin ?');
  14. mysql_select_db("testdb",$conn) or die('taze bitti');
  15.  
  16. # karakter seti değiştirilecek alan tipleri
  17. $types=array(
  18. 'CHAR',
  19. 'VARCHAR',
  20. 'TINYTEXT',
  21. 'TEXT',
  22. 'MEDIUMTEXT',
  23. 'LONGTEXT',
  24. 'TINYBLOB',
  25. 'BLOB',
  26. 'MEDIUMBLOB',
  27. 'LONGBLOB',
  28. 'ENUM',
  29. 'SET'
  30. );
  31.  
  32. /*---------------- yeter bu kadar ayar ----------------------- */
  33.  
  34. # follow the white rabbit
  35. $q1=mysql_query('SHOW TABLES');
  36. while ($r1=mysql_fetch_array($q1)) {
  37. $table=$r1[0];
  38. $sql='ALTER TABLE '.$table.' CONVERT TO CHARACTER SET '.
  39. $charset.' COLLATE '.$charset.'_turkish_ci';
  40. echo "\n\n
  41.  
  42. $table tablosunun karakter seti değiştirildi";
  43.  
  44. $q2=mysql_query('SHOW FIELDS FROM `'.$table.'`');
  45. while ($r2=mysql_fetch_assoc($q2)) {
  46. //print_r($r2);
  47. $field=$r2['Field'];
  48. $type=strtoupper($r2['Type']);
  49. $null=strtoupper($r2['Null']);
  50. $default=strtoupper($r2['Default']);
  51.  
  52. if (in_array($type,$types)) {
  53. if ($null=='YES') $null='NULL';
  54. else $null='NOT NULL';
  55.  
  56. if (!empty($default)) $default='DEFAULT '.$default;
  57.  
  58. $sql='ALTER TABLE `'.$table.'` MODIFY COLUMN `'.$field.'` '.$type.' CHARACTER SET '.
  59. $charset.' COLLATE '.$charset.'_turkish_ci '.$null.' '.$default;
  60. } // if
  61. } // while
  62. echo "\n
  63. $table tablosu içindeki alanların karakter seti değiştirildi";
  64. } // while

Yazdır Yazdır | 688 Görüntülenme | Kategori: PHP, Veritabanları & SQL | Trackback  Geri İzleme
Etiketler  Etiketler: , , , , , , ,

Benzer Yazılar


Yorum Yap


(gerekli)

(gerekli,yayınlanmaz)




XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>