cp1251->utf8

Andykalinin

Новичок
cp1251->utf8

Делаю новый двиг для сайта. хотелось бы базу перенести в utf8. Может кто подскажет как сконвертировать?
 

vovanium

Новичок
Если переносишь с MySQL 4.1 или выше, то довольно просто сделать дампером.

Качаешь его, в dumper.php для константы CHARSET ставишь "utf8", a для RESTORE_CHARSET прописываешь "forced->utf8"
после чего этот скрипт закидываешь на сервак, вводишь логин пароль к mysql и делаешь бэкап нужной базы, потом делаешь восстановление в нужную базу, таблицы в итоге в UTF-8, заодно и дамп будет на всякий случай :)

Только убедись что у тебя кодировка таблиц cp1251, а то если будет latin1, а данные cp1251, то MySQL некорректно преобразует русские символы.
 

zerkms

TDD infected
Команда форума
vovanium
смысл советовать говноскрипты, когда то же самое делается легко и непринуждённо парой па в блокноте?
 

Andykalinin

Новичок
zerkms, и че там полезного для меня?
vovanium zerkms Спасибо за подсказку.
но мне все таки интересно, можно ли это проделать средствами одного php скрипта?
 

zerkms

TDD infected
Команда форума
zerkms, и че там полезного для меня?
страницу открыл? молодец. теперь можешь почитать, возможно написанное там имеет какой-то (тайный) смысл...

хотя может действительно тебе не напрягать мозг и скачать готовый вышеуказанный говноскрипт, угу.
 

vovanium

Новичок
zerkms
когда то же самое делается легко и непринуждённо парой па в блокноте
Блин и это пишет программер с таким стажем...
Ню-ню давай вперед, особенно если база в несколько сотен метров, я посмотрю сколько ты будешь править её в блокноте...
Вместо того чтобы сделать пару кликов в скрипте, ну ты гений, чувствуется программерский дух, типа не будет нагружать программы, лучше сделаем вручную, а потом еще будем искать, где напортачили.

Что касается "гавноскрипта", то ты бы сначала посмотрел о чем речь, к примеру введя в яндексе бэкап/бекап или дамп...
Andykalinin
но мне все таки интересно, можно ли это проделать средствами одного php скрипта?
Я вообще-то и написал как это сделать одним скриптом, в любом случае тебе нужно сначала сделать бэкап базы в нужной кодировке, потом залить обратно изменив кодировки в CREATE TABLE. Если ты имел ввиду одним SQL запросом сделать - нельзя.
 

zerkms

TDD infected
Команда форума
Ню-ню давай вперед, особенно если база в несколько сотен метров, я посмотрю сколько ты будешь править её в блокноте...
ctrl+h, затем меняем

ENGINE=MyISAM CHARACTER SET 'cp1251' COLLATE ...
на
ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

и

COLLATE ...
на
COLLATE utf8_general_ci

для текстовых полей

я что-то упустил?

то ты бы сначала посмотрел о чем речь, к примеру введя в яндексе бэкап/бекап или дамп...
дампы/бэкапы я делаю через mysqldump. работает превосходно. советую.
 

vovanium

Новичок
zerkms
Разница в том что в моем случае даже дамп скачивать не нужно. Не говоря о том что блокнот загнется открывая файл в сотню метров. Ну и конечно хорошо если указанные строки не встречаются в тексте , а то нехорошо получится ;) Или ты считаешь что для php скрипта проблема сделать замену текста?

mysqldump конечно хорошо, но его как бы не боги писали, и он использует обычные SQL запросы. Мне лично в нем не нравится консольность, неудобство выбора конкретных таблиц и нет никакого прогрессбара. И в данном конкретном случае он не может поменять кодировку сам, т.е. в данном случае скрипт подходит лучше

-~{}~ 19.06.08 15:20:

ENGINE=MyISAM CHARACTER SET 'cp1251' COLLATE ...
Да кстати так кина не будет, забыл autoincrement, да и DEFAULT CHARSET=cp1251 и без кавычек пишется в дампе, а не CHARACTER SET.

Т.е. видишь даже в этих нескольких па уже накосячил
 

zerkms

TDD infected
Команда форума
Разница в том что в моем случае даже дамп скачивать не нужно.
ssh

Не говоря о том что блокнот загнется открывая файл в сотню метров
если уж и править локально - то лучше уж курить нормальные блокноты :) EmEditor, открывал (правда не совсем быстро) 2.5Гб mysql_query_log, с подсветкой. только что пробно открыл 400мб аналогичный, заняло 20-30секунд.

Ну и конечно хорошо если указанные строки не встречаются в тексте , а то нехорошо получится
отлично получится. в CREATE DATABASE просто также указать нужную кодировку

Или ты считаешь что для php скрипта проблема сделать замену текста?
не считаю, но xxx Mb файл в пхп модифицировать тоже будет как бы не очень комфортно. сколько вы говорите у вас allowed_memory на хостинге? (или там это делается как-то по-хитрому?)

... т.е. в данном случае скрипт подходит лучше
на вкус и цвет :)
 

Andykalinin

Новичок
Всем спасибо за советы. Кстати вот у себя отрыл старый скрипт с помощью которого перегонял базу из latin1 в cp1251.
PHP:
 <?php
print "<pre>";
$dbhost="localhost";
$dbuser="root";
$dbpass="";
$dbname="test";
$mysql_link = mysql_connect($dbhost,  $dbuser,  $dbpass) or exit("<br>Can't connect to MySQL!");
mysql_query("USE $dbname",  $mysql_link) or die ("<br>USE $dbname - error");

mysql_query("ALTER DATABASE `$dbname` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci");

$query=mysql_query("SHOW TABLES");
while($row=mysql_fetch_array($query))
{
    $table=$row[0];
    print "table: ".$row[0]."n";
    mysql_query("ALTER TABLE `$table` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci");
    if(mysql_errno()) print mysql_error()."n";
    
    $query2=mysql_query("DESCRIBE ".$table);
    while($row2=mysql_fetch_array($query2, MYSQL_ASSOC))
    {
        if(strpos($row2['Type'],"varchar")!==false || strpos($row2['Type'],"char")!==false || strpos($row2['Type'],"text")!==false)
        {
            mysql_query("ALTER TABLE $table CHANGE `".$row2['Field']."` `".$row2['Field']."` BLOB");
            if(mysql_errno()) print mysql_error()."n";
            mysql_query("ALTER TABLE $table CHANGE `".$row2['Field']."` `".$row2['Field']."` ".$row2['Type']." CHARACTER SET cp1251");
            if(mysql_errno()) print mysql_error()."n";
            else print " -- $table.".$row2['Field']." okn";
        }
    }
}
print "</pre>";

?>
Но с utf8 не прокатило, текстовые поля пустыми остались...
 

vovanium

Новичок
то лучше уж курить нормальные блокноты
Я тоже пользуюсь EmEditor, но когда открываешь большие дампы, тем более что mysqldump обычно делает строки по мегабайту, на которых EmEditor начинает буксовать очень конкретно. Ну опять же это не блокнот, а ты говоришь о блокноте.

Что касается логов то они предназначены для людей, там короткие строки, с ними редакторы на порядок лучше справляются.

в CREATE DATABASE просто также указать нужную кодировку
Ты не понял, если к примеру конвертить данный форум, то успешно заменишь и свои же советы. Т.к. в отличие от скрипта, твой редактор заменит всё, а не только то что находится в реальном CREATE TABLE.

сколько вы говорите у вас allowed_memory на хостинге?
Ты всё больше меня удивляешь, по-твоему нужно загонять весь дамп в память, чтобы сделать замену? :) Так для сведения этим скриптом успешно перегонялись дампы в 2,5 гига, и предполагаю, что allowed_memory было значительно меньше, порядка так на 2.

-~{}~ 19.06.08 15:50:

Andykalinin
Вот это реально говноскрипт, поздравляю :)
Это "чудо" предназначено для измения кодировки самих таблиц, т.е. когда данные в cp1251, а у таблиц прописано latin1. Сами данные при этом не меняются.
 

Andykalinin

Новичок
vovanium
Да я понял что это говноскрипт, поэтому дампером уже перекодировал :)
 

Фанат

oncle terrible
Команда форума
zerkms, там блокнот-то не нужен.
ему же не перекодировать из кривой, а просто слить/залить.

Andykalinin
И в данном конкретном случае он не может поменять кодировку сам
дружочег. давно ли ты стал таким специалистом, чтобы делать такие заявления?
 

kode

never knows best
Автор оригинала: *****
zerkms, там блокнот-то не нужен.
ему же не перекодировать из кривой, а просто слить/залить.

Andykalinin

дружочег. давно ли ты стал таким специалистом, чтобы делать такие заявления?
в sql дампе надо кодировку таблицы и полей поправить, а так-же перекодировку в инсертах (если есть)
 

vovanium

Новичок
давно ли ты стал таким специалистом, чтобы делать такие заявления?
А простого просмотра исходников mysqldump для этого недостаточно? :) Или я что-то пропустил, а ну как же поменять CHARSET в CREATE TABLE с помощью mysqldump, разве что через SQL_MODE убрать вообще дополнительную инфу из полей, но в таком случае потеряется и часть нужных данных.
 

vovanium

Новичок
Слив засчитан :) Замены кодировки таблиц там нет, либо ты их путаешь с SET NAMES, максимум можно убрать как и другими скриптами специальные опции которые появились в MySQL 4.1, а вместе с ними и инфу о кодировках.
 
Сверху