Как поменять кодировку всех таблиц в MySQL

Иногда бывает так, что из доступа к базе данных бывает только доступ через phpMyAdmin. А также бывает, что кто-то, создал базу с неправильной кодировкой. В моем случае этой кодировкой была — шведская. Что же делать для того чтобы поменять кодировку на более нужную — к примеру utf8?

Для этого существует очень простой способ. Необходимо выполнить вот такой вот запрос при помощи редактора SQL в phpMyAdmin:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

Все бы было ничего, если бы табличек было немного, или хотя бы полей. Но вот беда, табличек может быть и 30 и 40, а лично я очень ленивый, чтобы перебирать их все ручками, да к тому же надо не забыть поменять кодировку также в каждом текстовом поле. Пришлось немножко пошаманить, и вуаля, результат не заставил себя долго ждать.

Итак, MySQL сервер версии 5.0 и выше, умеет выполнить вот такой вот запрос:

SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as sqlcode
  FROM `information_schema`.`TABLES` t
 WHERE 1
   AND t.`TABLE_SCHEMA` = 'db_name'
 ORDER BY 1

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

Выполнив этот запрос, мы получим еще один SQL, модифицирующий кодировку таблиц, он будет выглядеть примерно так:

ALTER TABLE `mydatabase`.`auth_group_permissions` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`auth_group` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`auth_message` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`auth_permission` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`auth_user_groups` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`auth_user_user_permissions` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`auth_user` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`blog_post` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`django_admin_log` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`django_comments` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`django_comment_flags` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`django_content_type` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`django_session` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`gallery_album` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`gallery_photo` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`gallery_video` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `mydatabase`.`members_userprofile` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Вот теперь можно копировать результирующий скрипт и выполнять его в окошке SQL зпросов. Результатом выполнения данного скрипта будет изменение кодировки во всех таблицах MySQL базы данных.

Вот так можно сэкономить кучу времени отдав выполнение кучи грязной работы всякого рода автоматизации :)

Категории: Базы данных  Теги: , ,
  1. Трэкбеков пока нет.
  1. Игорь
    8 апреля 2011 15:33 | №1

    Спасибо! Очень помогло!!!!

  2. 8 апреля 2011 18:21 | №2

    Приятно слышать, что мой труд не пропадает напрасно, и приносит помощь.

  3. 12 апреля 2011 16:28 | №3

    Гениально, спасибо. :)

    Ковырялся с русификацией ZenCart, а там все таблицы (93 штуки) оказались с уже выставленной кодировкой. Скрипт отработал легко и звонко.

  4. 13 апреля 2011 16:18 | №4

    Спасибо, действительно помогло!

    Бился с базой битрикса, после обновления которого, сравнение таблиц (а их 360!!!) поменялось с utf8_general_ci на utf8_unicode_ci.

    ЗЫ: думал блог мертвый, ан нет! — можно поблагодарить!

    Спасибо =)

  5. Kristina
    29 апреля 2011 0:00 | №5

    Спасибо большое, очень помог :p

  6. Алексей
    11 мая 2011 23:11 | №6

    Громадное спасибо! Избавил от переустановки :D

  7. Владимир
    29 мая 2011 21:47 | №7

    Спасибо, дружище, очень помог.

  8. Олег
    30 мая 2011 8:47 | №8

    Великолепно и гениально! Очень помогло справиться с непокорным битриксом)

  9. 30 мая 2011 9:37 | №9

    Пожалуйста, пользуйтесь на здоровье, сам этим скриптом часто пользуюсь, и мне самому очень помогает

  10. Atapin
    25 июня 2011 2:49 | №10

    да, действительно спасибо! :)

    Раньше всегда менял кодировку, ну при необходимости, фактически вручную.

    Сохранял базу, далее поиск->замена и сохранение в UTF-8

    век живи век учись...

    ! Спасибо

  11. Erik
    6 июля 2011 23:31 | №11

    Замечательно, работает))))))

  12. Andrey
    9 августа 2011 10:08 | №12

    Спасибо, много пересмотрел и перепробовал, но сработало только это!!))))))))))))))

  13. FactoREAL
    29 октября 2011 17:43 | №13

    Я извиняюсь, но чё то у меня ниразу не работает =( у меня есть таблица изначально хранившаяся в БД с кодировкой latin1, теперь я хочу её перенести на другой сервер и перекодировать в utf8. создал копию таблицы с помощью mysqldump и перенёс на другой сервер. но никак оно не хочет становиться utf8... как отображались кракозябры, так и отображаются... если сделать set names latin1 то выборка происходит нормально т.е. получается что база остаась в кодировке latin1

  14. 29 октября 2011 17:46 | №14

    дак ведь после переноса на новый сервер, нужно прогнать скрипт, приведенный выше в посте.

  15. FactoREAL
    29 октября 2011 17:51 | №15

    ну я про него и писал, что у меня он не работает. у меня таблица всего одна, так что я руками прописываю ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci и результата никакого он не даёт. всё остаётся как и раньше в latin1

  16. FactoREAL
    29 октября 2011 17:58 | №16

    кстати я смотрю что в /usr/share/mysql/charsets нету никакого файла utf8.xml ... может мой мускул в принципе не способен работать с этой кодировкой ?

  17. 29 октября 2011 20:07 | №17

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

  18. Руслан
    1 ноября 2011 15:21 | №18

    Спасибо!

  19. Инна
    3 ноября 2011 22:30 | №19

    Я так свой блог спасла, бывают же добрые люди типо вас... :love:

  20. Дмитрий
    11 ноября 2011 19:58 | №20

    А у меня создалась после первого запроса база данных information_schema (28), с которой я и не знаю, что делать? К тому же удалить её тоже не знаю как... ;- (

  21. Лариса
    16 декабря 2011 11:32 | №21

    Спасибо!!!!!!!!!!!!!!!!!!!! этим легко решилась проблема виртуалмарта , когда из-за кодировки шведиш все характеристика товара были со знаками вопроса... во всем интернете предлагали фиг знает какие решения, только не эффективные. вы молодец :love:

  22. zolotivan
    10 февраля 2012 18:50 | №22

    Спасибо! Работает!

    Грешным делом подумал, что все комменты обыкновенная бот-поддержка блога, но терять было нечего и попробовал :) Работает!

  23. Irina
    18 февраля 2012 14:17 | №23

    Спасибо! Реально работает!

    У меня в БД 256 таблиц! Замучилась вручную менять, решила погуглить и нашла множество советов, но этот оказался реально рабочим! Радости нет предела!

    Дмитрий, базу данных information_schema оставьте в покое!

  24. 18 февраля 2012 14:27 | №24

    Дмитрий, Ирина права, оставьте базу information_schema в покое — это системная база MySQL. Если вы будуте ее ломать, то полетит весь сервер.

    Всегда рад, что мои советы помогают люям в решении их проблем.

:D :) ^_^ :( :o 8) ;-( :lol: xD :wink: :evil: :p :whistle: :woot: :sleep: =] :sick: :straight: :ninja: :love: :kiss: :angel: :bandit: :alien: