SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 14.11.2007 00:30:05

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Помогите перекодировать базу

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

Тема имхо избитая, но увы не могу перекодировать базу. Вот  вроде моя проблема описана (http://sqlinfo.ru/articles/info/5.html ) но видимо какие то модули php не стоят и recode недоступна (пускал php скрипт у хостера) . Пожалуста помогите советом или помогите переконверить
Одна из баз IPB около 50 метров, вторая мелка от Mambo. Ну как всегда хотелось бы срочно (ибо сайт уже вторую неделю лежит, сменил хостера и вот не могу восстановится)
Заранее спасибо.

ЗЫ: header базы:


-- MySQL dump 10.9
--
-- Host: localhost    Database: vnedrog_main
-- ------------------------------------------------------
-- Server version    4.1.20

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Неактивен

 

#2 14.11.2007 00:34:34

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

Re: Помогите перекодировать базу

Пришлите несколько содержательных строк из дампа: одну CREATE TABLE полностью (несколько строк) и несколько содержательных - с русским текстом.

recode в упомянутой статье - не расширешие PHP, а команда UNIX-shell, в WINDOWS есть аналоги, типа Shtirlitz. Перед тем, как что-либо перекодировать, сделайте копию дампа.

Неактивен

 

#3 14.11.2007 00:50:33

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Спасибо за ответ!
Увы, первое что я попробовал это ввести команду recode в Linuxe, но он ее так же не знает. Потом уже нашел про пхп.
Вот строчки.


CREATE TABLE `mos_bannerclient` (
  `cid` int(11) NOT NULL auto_increment,
  `name` varchar(60) NOT NULL default '',
  `contact` varchar(60) NOT NULL default '',
  `email` varchar(60) NOT NULL default '',
  `extrainfo` text NOT NULL,
  `checked_out` tinyint(1) NOT NULL default '0',
  `checked_out_time` time default NULL,
  `editor` varchar(50) default NULL,
  PRIMARY KEY  (`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


"Русский"

/*!40000 ALTER TABLE `mos_weblinks` DISABLE KEYS */;
LOCK TABLES `mos_weblinks` WRITE;
INSERT INTO `mos_weblinks` VALUES (18,35,0,'www.nivaclub.ru','http://www.nivaclub.ru/','Íèâà êëóá','2005-12-18 14:00:12',164,1,0,'0000-00-00 00:00:00',13,0,1,'target=1'),(17,35,0,'www.monsters.4wd.ru','http://www.monsters.4wd.ru/','Ïîðòà ë ëþáèòåëåé ýêñòðåìà ëüíîãî áåçäîðîæüÿ','2005-12-18 13:59:01',198,1,0,'0000-00-00 00:00:00',14,0,1,'target=1'),(16,35,0,'www.club4x4.ru','http://www.club4x4.ru/club/','4x4 Club','2005-12-18 13:57:41',224,1,0,'0000-00-00 00:00:00',15,0,1,'target=1'),(15,35,0,'www.shatoon.ru','http://www.shatoon.ru/','Âëà äèâîñòîêñêèé off-road êëóá','2005-12-18 13:56:51',182,1,0,'0000-00-00 00:00:00',16,0,1,'target=1'),(6,35,0,'www.offroad.ru','http://www.offroad.ru/','Âíåäîðîæíîå äâèæåíèå â Ðîññèè','2005-12-18 13:04:50',163,1,0,'0000-00-00 00:00:00',25,0,1,'target=1'),(7,35,0,'www.dorogi.net','http://www.dorogi.net/','
.........
и так далее

Еще раз спасио за помощь - жду ответа.
Алексей.

Неактивен

 

#4 14.11.2007 01:38:47

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

Re: Помогите перекодировать базу

Насколько я вижу, база у Вас очень адекватная.

Попробуйте изменить в файле все вхождения latin1 на utf8 и
не трогать русские данные. Дамп после этого должен загрузиться
(т.к. у Вас в дампе уже стоит строка SET NAMES utf8 и сами данные
находятся в utf8).

Проблема в том, что сами таблицы создаются в кодировке latin1
(CREATE TABLE) и сервер пытается перекодировать данные на лету
utf8->latin1, что приводит к записи символов "?" вместо русских букв.

Неактивен

 

#5 14.11.2007 02:06:53

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Попрjбовал - phpMyAdmin () выдает сообщение:

Ошибка
SQL-запрос:
CREATE TABLE `mos_core_acl_aro` (
`aro_id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`section_value` varchar( 240 ) NOT NULL default '0',
`value` varchar( 240 ) NOT NULL default '',
`order_value` int( 11 ) NOT NULL default '0',
`name` varchar( 255 ) NOT NULL default '',
`hidden` int( 11 ) NOT NULL default '0',
PRIMARY KEY ( `aro_id` ) ,
UNIQUE KEY `section_value_value_aro` ( `section_value` , `value` ) ,
UNIQUE KEY `mos_gacl_section_value_value_aro` ( `section_value` , `value` ) ,
KEY `hidden_aro` ( `hidden` ) ,
KEY `mos_gacl_hidden_aro` ( `hidden` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8;

Ответ MySQL: Документация
#1071 - Specified key was too long; max key length is 1000 bytes



Причем когда восстанавливался из исходной базы то все было ок (не считая ??? вместо рус букв)
latin1 менял на utf8 с помощью sed
#1071 - это что, номер строки? Но там вроде ничего нет. Не пойму где он хочет " max key length is 1000 bytes"?

Неактивен

 

#6 14.11.2007 02:29:32

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

Re: Помогите перекодировать базу

Хым. Обиделся на длину ключиков. Жалко.

Смысл такой. utf8 занимает 3 байта на каждый символ. Подсчет
идет при создании таблицы, а не при заливке данных. У Вас есть
ключики на section_value + value (кстати, зачем два?)
(240 + 240) * 3 = 1440 > 1000

Тривиальное решение - простить мою любовь к utf8 и поставить
однобайтовую кодировку (например, cp1251) вместо utf8.

Более сложное решение - сделать правильные ключики (а заодно
и избавиться от их дубликатов) по 166 символов на колонку
(тогда (166 + 166) * 3 = 996 < 1000).

Думаю, тривиальное решение Вас устроит больше. Но дубликаты
ключей советую все же убрать.

Неактивен

 

#7 14.11.2007 02:51:06

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Спасибо, попробую завтра. Пока изменил на cp1251, но phpMyAdmin отваливается "502 Bad Gateway". Попробую из SSH с помощью mysqldump . Надо ли при этом указывать какие то ключи кодировки для mysqldump-а при восстановлении (или все дефолтово поймет)?

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

Неактивен

 

#8 14.11.2007 11:49:24

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

Re: Помогите перекодировать базу

Если PhpMyAdmin не отсекает данные, то должен понять. Я не уверен, что он
все делает правильно, но попытка не пытка. В любом случае, проигрывание дампа
в виде mysql <dump.sql должно дать правильный результат.

Дупликаторы - в смысле, двойные ключи одинаковые?
Двойные ключи плохи тем, что перестраивать при изменении данных нужно оба ключа -
Вы замедляете изменения данных. А при выборке используется все равно только один
ключ (т.к. они одинаковые). Ну и занимаемое базой место, конечно, различается smile

Неактивен

 

#9 14.11.2007 13:02:49

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

К сожалению пока не победил mysqldump - выдает acess denied. Не могу понять что ему не нравится. Если вдруг знаете подскажите. Пишу так
mysqldump -u имя_юзера_базы -p пароль_базы -B имя_базы_хоста -h имя_хоста < my_base.sql
После этого он запрашивает еще какой то пароль - ввожу ему пароли разные возможные smile ему пофиг ?!?!
Вопрос конечно скорее к моему хостеру, но вдруг я чтото уже делаю не так. (хостинг rbc виртуальный сервер)

И еще непонятно - почему при кодировке cp1251 сервер виснит (502 Bad Gateway), а например при utf8 или koi8r он ее все таки загружает? (при koi8r вопросики заменяются на вопросики и ?Ж )
Еще раз большое спасибо за ответы.

Неактивен

 

#10 14.11.2007 13:54:23

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

Re: Помогите перекодировать базу

Код:

mysql -uuser -ppassword -hhostname dbname <my_base.sql

Обратите внимание на отсутствие пробела между -p и password. И на название команды.
Про gateway - это проблема на уровне HTTP, ее сможет решить только тот, кто знает, какие
гейтвеи использует сайт с phpmyadmin.

Неактивен

 

#11 14.11.2007 22:38:51

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Сорри, про mysqldump опечатка. Мне удалось разобраться как дампать базу у моего нового хостера с помощью mysqldump . Но увы - все тоже самое, те же самые "?" везде sad sad
Я в отчаянье sad Мб вы сможете еще чтото подсказать.
Спасибо.

Неактивен

 

#12 14.11.2007 23:55:32

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

Re: Помогите перекодировать базу

Не надо ничего дампитьsmile Надо правильно восстановить данные из существующего дампа.
Для этого нужно немножко изменить данные Вашего дампа (того, который Вы показывали
раньше). В нем надо заменить latin1->cp1251 (потому что с utf8 не получилось) и пропустить
его через команду mysql.

Если ничто другое не помогает, и если секретных данных нет, можете прислать файлик,
я его перекодирую.

Неактивен

 

#13 15.11.2007 00:28:55

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

Re: Помогите перекодировать базу

можно на amec0.webew.ru создать временный ftp-аккаунт, чтобы закачать файл (он большой), там команда recode работает

Неактивен

 

#14 15.11.2007 00:41:41

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

УРА!!! Нашел друга с командой recode (гы-гы-гы), переконвертили базу, вобщем сделал все действия как в статье вверху и все получилось чере phpMyAdmin!!!! УРА!
Но правда это все на мелкой базе. mysqldump как оказалось только делал вид что работал smile
Дело за малым - разобраться с ключиками для mysqldump-а
Еще раз спасибо за помощь!!!
Удачи!

Отредактированно vnedorog (15.11.2007 00:43:03)

Неактивен

 

#15 16.11.2007 11:07:12

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Помогите перекодировать базу

Наберите
mysqldump --help

Вот описание ключей:
http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html


Вообще таким способо можно получить ключи практически для любой текстовой программы от MySQL, включая серверы.

Неактивен

 

#16 16.11.2007 20:29:46

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Спасибо, с ключами вроде разобрался, все заливается. Ну если быть точнее то как раз не все smile
Моя база имеет размер около 49Мб . После того как делаю mydump  и смотрю ее через phpMyAdmin что ее размер 29Мб. При этом если я прошу хостера залить базу то phpMyAdmin пишет что она 49 Мб. MySqldump  на экран вроде ничего плохого не пишет. Почему так? Я пробовал ключии типа -q не помогает. Как ее заливает хостер он не говорит. Мб есть какие то ограничения на время ссессии для не  ROOT юзера или типа того? (но это вопрос наверное к хостеру)

Отредактированно vnedorog (16.11.2007 20:47:32)

Неактивен

 

#17 16.11.2007 22:43:48

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

Re: Помогите перекодировать базу

Честно говоря, не понял, в чем вопрос. Размер базы в рабочем состоянии,
разумеется, не должен совпадать с размером получаемого дампом SQL-файла.

Неактивен

 

#18 17.11.2007 23:51:27

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Не, я не про то. В обоих случаях я смотрю через phpMyAdmin. Если заливаю я то  phpMyadmin пишет Размер: 29 Мб, если я прошу залить хостера,то phpMyAdmin про эту же базу пишет Размер: 49.7 Мб

Неактивен

 

#19 18.11.2007 01:26:32

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

Re: Помогите перекодировать базу

Версии сервера / phpmyadmin одинаковые?

Неактивен

 

#20 19.11.2007 19:39:47

vnedorog
Участник
Зарегистрирован: 14.11.2007
Сообщений: 10

Re: Помогите перекодировать базу

Все, окончательно все победил! smile Еще раз спасибо за советы!
Базу засовывал по мелким запросам через phpMyAdmin - токо в этом случае она закачивалась в корректной кодировке и полностью (иногда прадва обрываясь с ошибками на отдельных завтпросах) Но все работает.
Правда помимо смены хостреа еще сменил и версию ИПБ. Под новый ИПБ таблицы нужны другие (добавлены доп поля) К сожалению не знал что можно у ИПБ есть upagrae. Пробовал вручную добавить отсутсвующие поля ALTER TABLE ibf_members ADD member_login_key_expire INT( 10 ) NOT NULL DEFAULT '0';
Часть добавилась, но phpMyAdmin отваливается - видимо очень большая таблица
Вопрос: пожалуйста помогите написать запрос к базе чтобы проверить есть ли поле member_login_key_expire и значение для таблицы ibf_members
Огромное вам спасибо за помощь!

Неактивен

 

#21 19.11.2007 19:45:44

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

Re: Помогите перекодировать базу

Самое простое
SELECT member_login_key_expire from ibf_members limit 1;
или
DESC ibf_members;
или
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ibf_members' AND COLUMN_NAME='member_login_key_expire';

С каждым постом здесь все больше убеждаюсь, что phpmyadmin это зло. Попробуйте использовать MySQL GUI Tools - http://dev.mysql.com/downloads/gui-tools/5.0.html, требуется правда право для пользователя подключаться к базе удаленно, но на хостинге это обычно можно указать в настройках юзера.

Неактивен

 

#22 19.11.2007 20:15:20

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

Re: Помогите перекодировать базу

Можете также удалить добавленные поля ALTER TABLE ibf_members DROP member_login_key_expire; и воспользоваться обновлением, включенным в движок

Неактивен

 

Board footer

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