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