Pull to refresh

Конвертация базы из Windows1251 в UTF8

Reading time 3 min
Views 37K
Всем привет. Столкнулся с вопросом конвертации базы из CP1251 в UTF8.
Полазив по просторам Интернета не нашел готового скрита (видимо плохо искал).
Вот решил написать свой скриптп. Конвертация происходит безо всяких дампов базы. Решены проблемы с символами е = ё и т.д.

продолжение под катом

Пользуйтесь на здоровье.
Исправьте в начале скрипта открывающий тег. Хабр его режет, пришлось заэкранировать вопросик ;)

UPD:
По просьбам трудящихся описываю алгоритм работы:
1. Переименовываем таблицу во временную.
2. Берем описание таблицы. В ней меняем defaul charset на utf8. Ставим collate utf8_bin(делается, чтобы буквы нормлаьно перекодировались. И не было проблем с е = ё и т.д. Но есть 1 трабла — при сравнении строковых значений будет учитываться регистр).
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);
//print $row['Tables_in_vspomni2']."\n";
$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';

//print $create_table_scheme;
//continue;

$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);
?>


P.S. Сегодня ночью БД проекта вспомни.ру сконвертировал этим скриптом за 17 минут.

Оригинал тут http://suhanovo.livejournal.com/4560.html
Tags:
Hubs:
+5
Comments 23
Comments Comments 23

Articles