как конвертировать данные хранящиеся в неверной кодировке

anDeRan

Новичок
как конвертировать данные хранящиеся в неверной кодировке

Есть ряд таблиц (utf-8), в которых записаны данные в неверной кодировке (windows-1251), как можно сделать дамп/экспорт этих таблиц, чтобы не потерять данные при изменении CHARACTER SET? проблема соответствует 2-й описанной в help'e (http://phpclub.ru/faq/wakka.php?wakka=Mysql41Rus&v=eum), но очень нужно сохранить данные, которые уже записаны...
 

camka

не самка
В поле с кодировкой utf-8 не может быть данных в однобайтовой кодировке windows-1251.

Но если уж они у вас дейтсвительно как-то туда затесались, то конвертировать можно через blob тип.
 

anDeRan

Новичок
хм... а подробнее можно? у меня 29 таблиц, в которых около 200 полей, из которых треть текстовые
 

camka

не самка
Для начала объясните, каким образом у вас в utf-8 поля затесались данные в windows-1251, и почему вы считаете, что данные именно в этой кодировке. База бы сама не позволила такого произвола.
 

anDeRan

Новичок
у таблиц collation utf8_general_ci, данные вносятся в кодировке windows-1251, MySQL 5.0.37... ситуация соответствует 2-й описанной в help'e (http://phpclub.ru/faq/wakka.php?wakka=Mysql41Rus&v=eum), т.е. большая часть скриптов выводят данные нормально, phpMyAdmin показывает данные в виде крокозябр (латинские символы с умляутами).

меня бы все устроило, но не все скрипты нормально выводят данные нормально, а попытка отыскать где же проблема, уже замучала (скрипты не мои, это форум)... SET NAMES, iconv не помогают.

Попытка сделать дамп и использовать перекодировщик не дала результата... он не смог перекодировать. :(

help plz
 

Gorynych

Посетитель PHP-Клуба
anDeRan

попробуйте сделать дамп с указанием в качестве кодировки Latin1

mysqldump --user=пользователь --password=пароль --default-character-set=latin1 имя_базы
 

anDeRan

Новичок
Gorynych
сделал... вместо русских символов - знаки вопросов
 

ioleg

Новичок
anDeRan
Уточни, у тебя он вопросительные знаки возвращает всегда или иногра кракозяблы?
 

anDeRan

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

PHP:
..connect to database...

$f_tables = array('f_users', 'f_topics');

echo '<pre>';
foreach ($f_tables as $f_table) {
	$result = mysql_query('SELECT * FROM ' . $f_table);
	$fields = mysql_num_fields($result);
	$rows = array();
	for ($i = 0; $i < $fields; $i++) {
		$type = mysql_field_type($result, $i);
		$name = mysql_field_name($result, $i);
		if ($type == 'string') {
			$rows[$name] = $i;
		}
	}
	if (!empty($rows)) {
		$id_name = mysql_field_name($result, 0);
		while ($data = mysql_fetch_row($result)) {
			$tmp = array();
			foreach ($rows as $name => $row) {
				if ($data[$row]) {
					$tmp[] = "`" . $name . "`='" . mysql_escape_string($data[$row]) . "'";
				}
			}
			echo 'UPDATE `' . $f_table . '` SET ' . implode(', ', $tmp) . ' WHERE ' . $id_name . "='" . $data[0] . "';\r\n";
		}
	}
}
echo '</pre>';
 

camka

не самка
anDeRan
Получается, что, все-таки, данные-то у вас в utf-8, просто они перекодируются из расчета, что они в latin1, а не win1251.

Если вы уверены, что ВСЕ данные в базе неверны, можно:
- брякнуть их в дамп в UTF-8 формате
- конверировать дамп в latin1
- и еще раз конвертировать win1251 -> utf-8.

В итоге должен получиться русский юникод.
 

anDeRan

Новичок
ioleg
...прошлое сообщение нечаянно перередактировал и ответ вам затер...

camka
попробовал... не получилось между 2 и 3 шагом... но спасибо конечно за помощь.

- проблему решил след. образом:
конвертировал таблицы в cp1251, а все потерянные данные в кириллице заменил при помощи update, сделанного в вышеприведенном скрипте.
 

camka

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

Что не получилось между 2-м и 3-м шагом?
 
Сверху