Статьи от создателей этого сайта

MySQL. Решение проблемы с буквами "ш" и "И" при создании и последующей закачке dump'а

Иногда, если создать dump базы MySQL, а потом его закачать в эту же базу, во всей базе буквы "ш" и "И" заменяются на непонятные символы. В моём случае было: MySQL 4.1, сравнение у всех таблиц и базы cp1251_general_ci, dump в UTF-8. Считаю, что следующий далее код PHP заменяет Во Всей Базе, т.е. в каждом поле каждой записи каждой таблицы, "закорючки" на буквы "ш" и "И".

У меня сработало, за ваши базы данных ответственности не несу. 

<?
  $db=mysql_connect("localhost", "user_name", "password");
  mysql_select_db("database");
  $request="SHOW TABLES";
  $result = mysql_query($request);
  while ($row = mysql_fetch_array($result))
  {
    if (1) // если нужно использовать префикс таблиц, то: (substr($row[0],0,2)=="префикс")
    {
      print($row[0]."<br>");
      $tmp="DESCRIBE ".$row[0];
      $tmp = mysql_query($tmp);
      while ($tmp_row = mysql_fetch_array($tmp))
      {
        print(" - ".$tmp_row[0]."<br>");
        $tmp1="UPDATE `".$row[0]."` SET `".$tmp_row[0]."` = REPLACE( `".$tmp_row[0]."`,  CONCAT( CHAR(209), CHAR(63) ),  CONCAT( CHAR(209), CHAR(136) ) );";
        $tmp1 = mysql_query($tmp1);
        $tmp1="UPDATE `".$row[0]."` SET `".$tmp_row[0]."` = REPLACE( `".$tmp_row[0]."`,  CONCAT( CHAR(208), CHAR(63) ),  CONCAT( CHAR(208), CHAR(152) ) );";
        $tmp1 = mysql_query($tmp1);
      }
    }
  }
?> 

Может не до конца вылечить большую базу - зависит от максимального времени выполнения PHP-скрипта (задаётся в параметрах PHP администратором сервера) - в таком случае обрабатывайте базу по частям - проявляйте смекалку - модернизируйте скрипт. Предложенный вариант тестировался на базе объёмом 10 МБ при максимальном времени выполнения скрипта 30 секунд. Кстати, если модернизируете скрипт для работы с большими базами, прошу мне его прислать - наверное, нужно применять AJAX. За деньги могу я поковыряться - присылайте коммерческие предложения, включающие подробное описание сложившейся у вас ситуации.

Благодарности за приведённую выше программулину прошу в гостевую книгу.

PS

Видел решения на Perl, требующие SSH - не у всех он есть.
Видел более сложные решения, не решающие проблему 8-)


размещено на http://vrubon.ru [ 12 Декабря 2010 г. ]


[ все материалы ]