SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.01.2010 12:32:10

nightssss
Участник
Зарегистрирован: 13.10.2009
Сообщений: 14

Изменение кодировки в сжатых данных

Здавствуйте.

Вот возникла такая проблема.

Есть таблица (600 тыс записей, около 2 Гигов), в ней 2 сжатых текстовых поля. В данный момент кодировка в этих полях cp1251.

Мне необходимо перевести кодировку в UTF8. Поэтому возник вопрос: Можно ли над сжатыми столбцами делать преобразование кодировки или нужно сначала распаковать? Как вообще лучше всего это сделать над такой таблицей?

Неактивен

 

#2 08.01.2010 12:50:57

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Изменение кодировки в сжатых данных

Что вы имеете в виду под сжатым текстовым полем? Текст, сжатый внешним архиватором? Как вы считываете сжатые данные обычно?

Неактивен

 

#3 08.01.2010 13:00:25

nightssss
Участник
Зарегистрирован: 13.10.2009
Сообщений: 14

Re: Изменение кодировки в сжатых данных

Сжато с помощью функции Mysql COMPRESS(). А читаю соответственно DECOMPRESS().

Неактивен

 

#4 08.01.2010 14:17:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Изменение кодировки в сжатых данных

Нужно разархивировать сконвертировать и снова заархивировать. В MySQL это можно сделать как-то так:

UPDATE tbl SET t = COMPRESS(CAST(CONVERT(uncompress(t) USING KOI8R) AS CHAR CHARACTER SET utf8));
 

Обязательно проверьте, что это работает на тестовой таблице и сделайте backup перед конвертацией всего.
Так как записей много, имеет смысл накладывать ограничение: WHERE id>0 AND id<=10000 и.т.д

Неактивен

 

#5 19.01.2010 11:52:13

nightssss
Участник
Зарегистрирован: 13.10.2009
Сообщений: 14

Re: Изменение кодировки в сжатых данных

Изменял таким образом:

UPDATE tablename SET `report_short`=COMPRESS(convert(convert(uncompress(`report_short`) USING cp1251) USING UTF8)) WHERE `id`>'0' AND `id`<='100000'

Первые 100 тыс записей норм, вторые почему-то весь текст такой стал: Сила нападениС

Скопировал опять исходную таблицу и начал делать заново, во второй раз такая фигня стала с 400-500 тыс.

Как вообще исправить вот такие символы которые я указал? convert пробовал в разных вариантах, не помогает. Загрузил в онлайн конвертер кодировок, показало CP1251 → UTF-8, но исправить в таблице не получается.

Неактивен

 

#6 19.01.2010 13:22:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Изменение кодировки в сжатых данных

А если точечно выбрать данные из этой таблицы из «плохого» диапазона — там данные
в cp1251?

Неактивен

 

#7 19.01.2010 13:48:04

nightssss
Участник
Зарегистрирован: 13.10.2009
Сообщений: 14

Re: Изменение кодировки в сжатых данных

Вот почему-то на случайном диапазоне проявляется такой косяк.

Вроде в принципе функция php iconv("UTF-8", "WINDOWS-1251", $text) вернуть cp1251, а затем опять в mysql делать конверт попробую, но некоторые буквы теряются.

Неактивен

 

#8 19.01.2010 13:58:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Изменение кодировки в сжатых данных

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

Неактивен

 

#9 19.01.2010 14:06:25

nightssss
Участник
Зарегистрирован: 13.10.2009
Сообщений: 14

Re: Изменение кодировки в сжатых данных

Я уже 3й раз копию базы делаю из-за этого, пробовал по 10 тыс записей делать, по 20 тыс, по 100 тыс и каждый раз случайно это вылезает, приходится после каждого преобразования проверять 1-2 записи из диапазона на корректность.

Буду пробовать еще...

Отредактированно nightssss (19.01.2010 14:17:19)

Неактивен

 

#10 19.01.2010 15:00:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Изменение кодировки в сжатых данных

А нижний диапазон Вы тоже поднимаете ведь? Может, сделать бэкап, обновить всю
таблицу и потом сделать точечные проверки, что всё хорошо?

Неактивен

 

#11 19.01.2010 16:52:03

nightssss
Участник
Зарегистрирован: 13.10.2009
Сообщений: 14

Re: Изменение кодировки в сжатых данных

Я все запросы выполнял через phpmyadmin. Теперь же зашел через ssh и выполнял всё из консоли, и первый столбец преобразовался без проблем, хотя делал всё также. Сейчас второй преобразовываю.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson