Як поміняти кодування всіх таблиць у MySQL базі

Зазвичай текст помилки має такий вигляд:
Execution of a query to the database failed - Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation 'if'
Warning: Cannot modify header information - headers already sent by (output started at /sata1/home/users/foldername/www/sitename.com/manager/includes/header.inc.php:7) in /sata1/home/users/shenevmer/www/sitename.com/manager/includes/document.parser.class.inc.php on line 2732
« MODx Parse Error »
MODx encountered the following error while attempting to parse the requested resource: | ||
« Execution of a query to the database failed - Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation 'if' » | ||
SQL: SELECT `db_she`.`modx_site_templates`.templatename as name, `db_she`.`modx_site_templates`.id, `db_she`.`modx_site_templates`.description, `db_she`.`modx_site_templates`.locked, if(isnull(`db_she`.`modx_categories`.category),'Без категорії',`db_she`.`modx_categories`.category) as category FROM `db_she`.`modx_site_templates` left join `db_she`.`modx_categories` on `db_she`.`modx_site_templates`.category = `db_she`.`modx_categories`.id ORDER BY 5,1
[Copy SQL to ClipBoard] |
||
Parser timing | ||
MySQL: | 0,0442 s | (0 Requests) |
PHP: | 1333655752,1659 s | |
Total: | 1333655752,2100 s |
Якщо ви зайдете в керування БД (наприклад MySQL), то проблему можна побачити в такому вигляді:
Хоча у вас при встановленні в налаштуваннях задавалася кодування utf8_general_ci
Як змінити кодування всіх таблиць в MySQL базі
Оскільки в Базі даних можуть бути десятки, сотні таблиць і в кожній вручну змінювати параметр кодування порівняння це зайва робота. Є рішення.
Отже, 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 на ім'я вашої БД.
Натискаємо ОК
Отриманий результат і буде тим скриптом, який нам потрібно ще раз скопіювати в це вікно і виконати.
Ми отримаємо щось на кшталт:
ALTER TABLE `db_she`.`modx_active_users` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `db_she`.`modx_categories` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `db_she`.`modx_documentgroup_names` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; .... .... ALTER TABLE `db_she `.`modx_document_groups` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `db_she`.`modx_event_log` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `db_she`.`modx_keyword_xref` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `db_she`.`modx_manager_log` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Виділяємо цей код - вставляємо в вікно запитів до БД і натискаємо ОК.
В результаті отримаємо для всієї Бази даних, параметр порівняння замість latin1_swedish_ci --> utf8_general_ci
, і це буде виглядати так:
А також у MODx можуть видаватися помилки: Cannot modify header information - headers already sent by. Проблема полягає в невірно заданому параметрі порівняння вашої БД. Наприклад, під час встановлення кодування utf8_general_ci, а якщо зайти в PHP MyAdmin - і зайдете в одну з таблиць, то побачите Порівняння: latin1_swedish_ci