Вход на сайт
Cкрипт циклического mysql - запроса
425
30.08.09 13:07
задача - изменить кодировку в каждой из таблиц.
Всего их - таблиц - 200 с лишним, поэтому двести движений типа ALTER TABLE `table_name` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci делать лень.К тому же, это эксперименты, потом может быть надо будет назад в utf8, или еще куда...
Пытаюсь все одним баш-скриптом, и вроде сложного особо ничего нет, надо как то так:
1. собрать в массив результат SHOW TABLES
2. прогнать по циклу, меняя кодировку для каждого элемента
Но что то пока не выходит.
Просто подумал - может, кто то уже был в подобной ситуации и решал эту задачу, или где есть готовый скрипт, а я найти не могу?
Всего их - таблиц - 200 с лишним, поэтому двести движений типа ALTER TABLE `table_name` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci делать лень.К тому же, это эксперименты, потом может быть надо будет назад в utf8, или еще куда...
Пытаюсь все одним баш-скриптом, и вроде сложного особо ничего нет, надо как то так:
1. собрать в массив результат SHOW TABLES
2. прогнать по циклу, меняя кодировку для каждого элемента
Но что то пока не выходит.
Просто подумал - может, кто то уже был в подобной ситуации и решал эту задачу, или где есть готовый скрипт, а я найти не могу?
NEW 30.08.09 16:05
шото в этом роде. Подразумевается что ты хосчешь сгенерить скрипт который меняет все таблицы в определенной базе/схеме (в этом случае database_name). Если нет то работай с IN/NOT IN.
Как убрать "-" "+" "|" искать лень
в ответ 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
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, вышел зайчег погулядь
NEW 30.08.09 16:39
вот короче
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
в результате получаешь скрипт который меняет кодировку
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, вышел зайчег погулядь
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 сек, и сама работа скрита завершится с ошибкой.
Да...но все таки по первому методу тоже бы хотелось увидеть, где ошибка
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 сек, и сама работа скрита завершится с ошибкой.
Да...но все таки по первому методу тоже бы хотелось увидеть, где ошибка
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 надо своять ?
Да зачем?Спасибо, вполне вот рабочий скрипт есть, я просто стараюсь рассматривать все возможные варианты..
как вызываешь ?
версия 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 надо своять ?
Да зачем?Спасибо, вполне вот рабочий скрипт есть, я просто стараюсь рассматривать все возможные варианты..
NEW 30.08.09 19:55
это и логично, потому как этот запрос генерит SQL-Script, этот скрип то тебе и нужно запускать чтоб поменять кодировку.
в ответ alexnaum 30.08.09 19:35
В ответ на:
В общем, если вызываю с консоли, странно, вроде все обрабатывается, никаких ошибок не пишет, по окончании кодировка остается такая, какая была..
В общем, если вызываю с консоли, странно, вроде все обрабатывается, никаких ошибок не пишет, по окончании кодировка остается такая, какая была..
это и логично, потому как этот запрос генерит SQL-Script, этот скрип то тебе и нужно запускать чтоб поменять кодировку.
0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
NEW 30.08.09 21:48
если я просто исполняю -
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,
то никакой скрипт не генерируется, создается пустой файл с этим именем, и все...
Хотя... нашел ошибку..все, вижу, что делаю, спасибо, можно закончить на этом.
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,
то никакой скрипт не генерируется, создается пустой файл с этим именем, и все...
Хотя... нашел ошибку..все, вижу, что делаю, спасибо, можно закончить на этом.
NEW 31.08.09 23:07
в ответ BSDLamer 30.08.09 19:55
Вот еще что подумал,
почему то при обращении к information_schema требует ручного ввода пароля, даже если я юзера и пароль явно прописываю в запросе.Можно ли это как то обойти?
При обращении к другим базам этого нет...
Просто думал, что вот такой скрипт будет работать без ручного ввода пароля..
В общем, конечно, некритично, просто интересно, почему так..
почему то при обращении к 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}
#!/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}
В общем, конечно, некритично, просто интересно, почему так..
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}
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}
Сам второй раз вызываю пароль..для ручного ввода...