MySQL - смена кодировки

one
На сайте с 15.04.2007
Offline
336
one
9680

Как, одним махом поменять кодировку у таблиц и полей в них. И попутно... Как после конвертнуть данные в нужную кодировку. В принципе я думаю в этом поможет sypex dumper... но все же...

Более конкретно... Кодирока БД UTF8, кодировка таблиц частично UTF8 ичастично CP1251 и так же у полей таблиц обстоит ситуация. Надо выравнять все и сделать что бы было UTF8 везде...

Решения для автоматизации действий ( https://www.facebook.com/automationstudio20/ ) в интернете.
Fantom
На сайте с 11.12.2004
Offline
43
#1

Sypex Dumper вам в помощь.

Надо на структуру базы смотреть, может есть возможность ту часть которая в CP1251 забекапить дампером и им же перезалить ее в UTF8.

Когда я со своими базами развлекался, мне хватило этой информации http://sypex.net/encoding/

one
На сайте с 15.04.2007
Offline
336
one
#2

Я конвертил данные частично ручками... сливал дамп sypexом менял на нужную кодировку SET NAMES и заливал в БД обратно указав в какой колировке лить данные sypexy... Всо конвертилось на ура но, базы были не большие, до 50Мб а в данном случае надо провернуть такой фокус с 250мб базой. Вот и подумалось что или из кмандной строки или чарез phpMyAdmin будет быстрей и удобней это сделать...

edogs software
На сайте с 15.12.2005
Offline
775
#3

http://dev.mysql.com/doc/refman/5.1/en/charset-convert.html Вам поможет, если мы правильно поняли задачу.

Или если имелось ввиду не то, что мы подумали сначала, посмотрите тут http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html скрипт от Markus Hausammann, возможно это как раз оно.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
one
На сайте с 15.04.2007
Offline
336
one
#4
edogs:
http://dev.mysql.com/doc/refman/5.1/en/charset-convert.html Вам поможет, если мы правильно поняли задачу.
Или если имелось ввиду не то, что мы подумали сначала, посмотрите тут http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html скрипт от Markus Hausammann, возможно это как раз оно.

По первой ссылке 5й мускул... не то... у меня на 4ке все крутиться... По второй тожде самое да и плюс ко всему меня не интересует настройка\правка конфига сервера или же скриптов сайта. Меня интересует исключительно внесение изминений в самой БД...

edogs software
На сайте с 15.12.2005
Offline
775
#5
one:
По первой ссылке 5й мускул... не то... у меня на 4ке все крутиться... По второй тожде самое да и плюс ко всему меня не интересует настройка\правка конфига сервера или же скриптов сайта. Меня интересует исключительно внесение изминений в самой БД...

Первая ссылка по 5 мускулу, да, но те же самые функции работают и в 4.1, документация ничем не отличается http://dev.mysql.com/doc/refman/4.1/en/charset-convert.html Так что вполне применимы у Вас.

По второй ссылке мы обращали Ваше внимание не на документацию, а на скрипт от Markus Hausammann. Вытащим сюда


<?php
$db = mysqli_connect('localhost','username','password', 'db');
if(mysqli_connect_errno())
{
echo "Cannot connect to the database - incorrect details";
}

$sql = 'SHOW TABLES';
if ( !( $result = $db->query( $sql ) ) ) {
echo '<span style="color: red;">Get SHOW TABLE - SQL Error: <br>' . "</span>\n";
}


while ( $tables = $result->fetch_row() ) {
echo $tables[0];
# Loop through all tables in this database
$table = $tables[key($tables)];

if ( !( $result2 = $db->query("ALTER TABLE ".$table." COLLATE utf8_general_ci") ) ) {
echo '<span style="color: red;">UTF SET - SQL Error: <br>' . "</span>\n";

break;
}

print "$table changed to UTF-8 successfully.<br>\n";

# Now loop through all the fields within this table
if ( !($result2 = $db->query("SHOW COLUMNS FROM ".$table) ) ) {
echo '<span style="color: red;">Get Table Columns Query - SQL Error: <br>' . "</span>\n";

break;
}

while ( $column = $result2->fetch_assoc() )
{
$field_name = $column['Field'];
$field_type = $column['Type'];

# Change text based fields
$skipped_field_types = array('char', 'text', 'enum', 'set');

foreach ( $skipped_field_types as $type )
{
if ( strpos($field_type, $type) !== false )
{
$sql4 = "ALTER TABLE $table CHANGE `$field_name` `$field_name` $field_type CHARACTER SET utf8 COLLATE utf8_general_ci";
$result4 = $db->query($sql4);

echo "---- $field_name changed to UTF-8 successfully.<br>\n";
}
}
}
echo "<hr>\n";
}
$result->free();
$result2->free();
$result4->free();
?>
IQPartner
На сайте с 20.09.2007
Offline
138
#6

Часто бывает что

- данные записаны в MySQL уже на русском языке, а кодировка самой базы данных отличается от cp1251 (например, latin_swidish или UTF8). В таком случае работать с данными в phpMyAdmin вы не сможете, а вместо русского в базе вы видите кроказяблы;

- вы переносите дамп базы данных с сервера на сервер, а на них разные версии MySQL и, как результат, у вас на сайте одни вопросики;

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

Причем, если данные изначально записаны на русском (при этом не важно какая кодировка была установлена у самой базы данных), а теперь стоит задача сменить кодировку самой БД (это можно сделать с помощью phpMyAdmin) и установить русскую, или любую другую, то напрямую это делать нельзя. При смене кодировки у базы на русскую, данные, которые уже были внесены по-русски портятся безвозвратно. И восстановить их уже не получится.

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

Вначале, ВСЕ данные переводятся в бинарный вид, чтобы никакие изменения их не испортили. А после этого можно менять кодировку чего угодно, на какую угодно, как угодно и т.д. когда все готово, данные переводятся обратно и все работает.

(Проверенно было неоднократно на разных БД и разных серверах)

Делается это легко и простого с помощью скрипта автоматической смены кодировки. Знаний php при этом не требуется.

***

Инструкция:

В строке 11 и 17 указываем данные вашей БД.

В 13-ой и 14-ой – какую кодировку на какую нужно менять.

Перед физической сменой можно провести тест. В сторке 12 смените false на true и программа вместо записи в базу данных выведет сделанные изменения на экран. Выложите скачанный файл и запустите его.

Если все в порядке, меняйте обратно true на false и смело запускайте скрипт.

Удачи!

P.S. Чтобы все гарантированно сработало, лучше всего в корневую директорию сайта выложить этот простенький php.ini

С 2009-го меняю PayPal->WMZ за 8% (вывод с партнерок -7%) (/ru/forum/959037), Оплачу за вас PayPal за 0-3%. Слать Рaypal ТОЛЬКО на admin[/гаф-гаф\]israword.co.il - иначе это не я;

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий