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

Создание, покупка и продажа сайтов. Оптимизация, обсуждение различных CMS

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

Сообщение Oleg » Вт янв 27, 2009 4:00 am

Всем привет. Столкнулся с вопросом конвертации базы из 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);
?>


(С) http://suhanovo.livejournal.com/4560.html
Аватара пользователя
Oleg
Администратор
Администратор
 
Сообщения: 75649
Зарегистрирован: Вс окт 09, 2005 9:08 pm
Откуда: Москва
Медали: 10
Пол: Мужской
Соционический тип: Бальзак
Тип по психе-йоге: Сократ (ВЛЭФ)
Темперамент: Флегматик
Профессия: Программист, оптимизатор

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

Сообщение Oleg » Вт янв 27, 2009 4:00 am

Так как проблема стандартная решил ее запостить на форум.
Аватара пользователя
Oleg
Администратор
Администратор
 
Сообщения: 75649
Зарегистрирован: Вс окт 09, 2005 9:08 pm
Откуда: Москва
Медали: 10
Пол: Мужской
Соционический тип: Бальзак
Тип по психе-йоге: Сократ (ВЛЭФ)
Темперамент: Флегматик
Профессия: Программист, оптимизатор


Вернуться в Разработка сайтов

Кто сейчас на конференции

Зарегистрированные пользователи: GoGo [Bot], Google [Bot], Joker, KostyaAndreev, vadimr, whoh, Yandex 3.0 [Bot], Yandex [Bot], Zevs, Марина99, на лошади весёлой