VDSPlanet.ru Making the difference in VDS Hosting
Конвертация базы данных из Windows-1251 в UTF8

Материал из Wiki.VDSPlanet.ru.

Перейти к: навигация, поиск

По просьбам трудящихся описываю алгоритм работы:

  1. Переименовываем таблицу во временную.
  2. Берем описание таблицы. В ней меняем defaul charset на utf8. Ставим collate utf8_bin (делается, чтобы буквы нормлаьно перекодировались. И не было проблем с е = ё и т.д. Но есть проблема - при сравнении строковых значений будет учитываться регистр).
  3. Отключаем использование ключей(увеличивается скорость вставки). ALTER TABLE table_in_utf8 DISABLE KEYS;
  4. Вставляем данные из таблицы, которая у нас в cp1251 в таблицу с кодировкой utf8. INSERT INTO table_in_utf8 SELECT * FROM table_in_cp1251;
  5. Включаем использование ключей ALTER TABLE table_in_utf8 ENABLE KEYS;

Ну а скриптег написан для того, чтобы не делать все это ручками, если в вашем проекте очень много таблиц.

Запускать скрипт можно из консоли `php -f export.php` или через веб.

<?php
$time = microtime(true);
$db = 'vspomni';
$login = 'vspomni';
$passw = ;
$host = 'vspomni.ru';
$res = mysql_connect($host, $login, $passw);
mysql_select_db($db);
mysql_query('SET NAMES utf8;');
$rs = mysql_query('SHOW TABLES');
print mysql_error(); //the notorious 'command out of synch' message :(
while (($row=mysql_fetch_assoc($rs))!==false) {
 $time1 = microtime(true);
 $table_name = $row['Tables_in_'.$db];
 $query = 'SHOW CREATE TABLE '.$table_name;
 $row_create = mysql_query($query);
 print mysql_error();
 $row1 = mysql_fetch_assoc($row_create); 
 if (strpos($row1['Create Table'], 'DEFAULT CHARSET=utf8') !== false) { print 'Table '.$table_name.' - skipped'."\n"; continue; }
 $create_table_scheme = str_ireplace('cp1251', 'utf8', $row1['Create Table']); // CREATE TABLE SCHEME
 $create_table_scheme = str_ireplace('ENGINE=InnoDB', 'MyISAM', $create_table_scheme);
 $create_table_scheme .= ' COLLATE utf8_bin';
 $query = 'RENAME TABLE '.$table_name.' TO '.$table_name.'_tmp_export'; // RENAME TABLE;
 mysql_query($query);
 $error = mysql_error();
 if (strlen($error) > 0) { print $error.' - LINE '.__LINE__."\n"; break; }
 $query = $create_table_scheme;
 mysql_query($query);
 $error = mysql_error();
 if (strlen($error) > 0) { print $error.' - LINE '.__LINE__."\n"; break; }
 $query = 'ALTER TABLE '.$table_name.' DISABLE KEYS';
 mysql_query($query);
 $error = mysql_error();
 if (strlen($error) > 0) { print $error.' - LINE '.__LINE__."\n"; break; }
 $query = 'INSERT INTO '.$table_name.' SELECT * FROM '.$table_name.'_tmp_export';
 mysql_query($query);
 $error = mysql_error();
 if (strlen($error) > 0) { print $error.' - LINE '.__LINE__."\n"; break; }
 $query = 'DROP TABLE '.$table_name.'_tmp_export';
 mysql_query($query);
 $error = mysql_error();
 if (strlen($error) > 0) { print $error.' - LINE '.__LINE__."\n"; break; }
 $time3 = microtime(true);
 $query = 'ALTER TABLE '.$table_name.' ENABLE KEYS';
 mysql_query($query);
 $error = mysql_error();
 if (strlen($error) > 0) { print $error.' - LINE '.__LINE__."\n"; break; }
 print 'Enable keys to '.$table_name.'. time -'.(microtime(true) - $time3)."\n";
 print 'converted '.$table_name.'. time - '.(microtime(true) - $time1)."\n\n";
}
mysql_free_result($rs);
print 'done. total time -'.(microtime(true) - $time);
?>

Взято для использования отсюда http://suhanovo.livejournal.com/4560.html