Deutsch
Germany.ruФорумы → Архив Досок→ Linux & Co

Cкрипт циклического mysql - запроса

425  
alexnaum местный житель30.08.09 13:07
alexnaum
30.08.09 13:07 
задача - изменить кодировку в каждой из таблиц.
Всего их - таблиц - 200 с лишним, поэтому двести движений типа ALTER TABLE `table_name` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci делать лень.К тому же, это эксперименты, потом может быть надо будет назад в utf8, или еще куда...
Пытаюсь все одним баш-скриптом, и вроде сложного особо ничего нет, надо как то так:
1. собрать в массив результат SHOW TABLES
2. прогнать по циклу, меняя кодировку для каждого элемента
Но что то пока не выходит.
Просто подумал - может, кто то уже был в подобной ситуации и решал эту задачу, или где есть готовый скрипт, а я найти не могу?
#1 
BSDLamer Хвостатый Carpal Tunnel30.08.09 16:05
BSDLamer
NEW 30.08.09 16:05 
в ответ alexnaum 30.08.09 13:07
В ответ на:
mysql information_schema -e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='database_name';" -p --skip-column-names

шото в этом роде. Подразумевается что ты хосчешь сгенерить скрипт который меняет все таблицы в определенной базе/схеме (в этом случае database_name). Если нет то работай с IN/NOT IN.
Как убрать "-" "+" "|" искать лень
0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#2 
BSDLamer Хвостатый Carpal Tunnel30.08.09 16:39
BSDLamer
NEW 30.08.09 16:39 
в ответ BSDLamer 30.08.09 16:05, Последний раз изменено 30.08.09 16:53 (BSDLamer)
вот короче
mysql information_schema -e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='database_name';" -p --skip-column-names -s > char_set.sql
в результате получаешь скрипт который меняет кодировку
0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#3 
alexnaum местный житель30.08.09 17:02
alexnaum
NEW 30.08.09 17:02 
в ответ BSDLamer 30.08.09 16:39
что то пока "ошибка синтаксиса"
#4 
BSDLamer Хвостатый Carpal Tunnel30.08.09 17:07
BSDLamer
NEW 30.08.09 17:07 
в ответ alexnaum 30.08.09 17:02
ты database_name на имя своей базы поменял ?
можно весь аутпут в студию, а то я свой стекляный шар сегодня забыл
0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#5 
alexnaum местный житель30.08.09 18:02
alexnaum
NEW 30.08.09 18:02 
в ответ BSDLamer 30.08.09 17:07
поменял..
mysql information_schema -e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='test_2';" -p --skip-column-names -s
Ошибка
SQL-запрос: Документация
mysql information_schema - e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='test_2';" - p - - skip - COLUMN - NAMES - s
Ответ MySQL: Документация
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql information_schema -e "select concat('ALTER TABLE ', TABLE

Вот еще, нашел PHP скрипт, уже готовый - вот тут взял - http://www.iqpartner.info/ru/?ARTICLE=charset_auto_change
пишут, что
╚Вначале, ВСЕ данные нужно перевести в бинарный вид и тогда смена кодировки базы данных их не затронет. После этого можно менять кодировку чего угодно (БД, Таблиц, Полей), на какую угодно. А когда кодировка изменена, то формат данных меняете обратно.╩
скрипт сработал корректно, все таблицы в результате как надо, единственное, время исполнения скрипта больше 30 секунд, так что если в PHP-ini прописано макс экзекуте тайм 30 сек, как у меня было, то надо увеличить этот параметр, хотя бы на время работы скрипта. Иначе будут изменены кодировки не всех таблиц, а только тех, что скрипт успеет пройти за 30 сек, и сама работа скрита завершится с ошибкой.
Да...но все таки по первому методу тоже бы хотелось увидеть, где ошибка
#6 
BSDLamer Хвостатый Carpal Tunnel30.08.09 18:21
BSDLamer
NEW 30.08.09 18:21 
в ответ alexnaum 30.08.09 18:02
версия ?
как вызываешь ?
у меня это отрабатывает из коммандной строки. Версия мускула 5.0.51а. Тебе это в php надо своять ?
0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#7 
alexnaum местный житель30.08.09 19:35
alexnaum
NEW 30.08.09 19:35 
в ответ BSDLamer 30.08.09 18:21
версия ?
как вызываешь ?

версия 5.1.30
так же пробовал на 4.1.16.
В общем, если вызываю с консоли, странно, вроде все обрабатывается, никаких ошибок не пишет, по окончании кодировка остается такая, какая была..
Ошибку выше привел, если через phpmyadmin..
у меня это отрабатывает из коммандной строки. Версия мускула 5.0.51а.
В виндах стоит тока денвер, все по умолчанию - root без пароля, ради полноты эксперимента запускаю это дело в cmd под денвером - но проверить не могу, поскольку ERROR 1045 (28000): Access denied for user '=root'@'localhost' (using password:NO)
Тебе это в php надо своять ?
Да зачем?Спасибо, вполне вот рабочий скрипт есть, я просто стараюсь рассматривать все возможные варианты..
#8 
BSDLamer Хвостатый Carpal Tunnel30.08.09 19:55
BSDLamer
NEW 30.08.09 19:55 
в ответ alexnaum 30.08.09 19:35
В ответ на:
В общем, если вызываю с консоли, странно, вроде все обрабатывается, никаких ошибок не пишет, по окончании кодировка остается такая, какая была..

это и логично, потому как этот запрос генерит SQL-Script, этот скрип то тебе и нужно запускать чтоб поменять кодировку.
0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#9 
alexnaum местный житель30.08.09 21:48
alexnaum
NEW 30.08.09 21:48 
в ответ BSDLamer 30.08.09 19:55, Последний раз изменено 30.08.09 21:53 (alexnaum)
если я просто исполняю -
mysql information_schema -e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='test_2';" -p --skip-column-names -s - то результат, как я сказал выше, а если добавляю > char_set.sql,
то никакой скрипт не генерируется, создается пустой файл с этим именем, и все...
Хотя... нашел ошибку..все, вижу, что делаю, спасибо, можно закончить на этом.
#10 
alexnaum местный житель31.08.09 23:07
alexnaum
NEW 31.08.09 23:07 
в ответ BSDLamer 30.08.09 19:55
Вот еще что подумал,
почему то при обращении к information_schema требует ручного ввода пароля, даже если я юзера и пароль явно прописываю в запросе.Можно ли это как то обойти?
При обращении к другим базам этого нет...
Просто думал, что вот такой скрипт будет работать без ручного ввода пароля..
В ответ на:
#!/bin/sh
CHARSETFILE=/path_to_file/char_set.sql
mysql -u root -ppass information_schema -e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='test_2';" -p --skip-column-names -s > ${CHARSETFILE}
mysql -u root -ppass test_2 < ${CHARSETFILE}

В общем, конечно, некритично, просто интересно, почему так..
#11 
  anatoli888 свой человек01.09.09 01:28
NEW 01.09.09 01:28 
в ответ alexnaum 30.08.09 21:48
ну наверное 2>&1 sql.sql поможет.
#12 
  anatoli888 свой человек01.09.09 01:31
NEW 01.09.09 01:31 
в ответ alexnaum 31.08.09 23:07
хз. может какие нить grants прописаны. в таблице mysql есть db и users посмотри там или
show grants;
show <что то еще>;
#13 
alexnaum местный житель01.09.09 23:19
alexnaum
NEW 01.09.09 23:19 
в ответ alexnaum 31.08.09 23:07
вот я тормознул...
В ответ на:
mysql -u root -ppass information_schema -e "select concat('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') from TABLES where TABLE_SCHEMA='test_2';" -p --skip-column-names -s > ${CHARSETFILE}

Сам второй раз вызываю пароль..для ручного ввода...
#14