# 1273 - Невідоме зіставлення: 'utf8mb4_unicode_ci' cPanel


183

У мене на локальній машині є база даних WordPress, яку я хочу перенести на розміщений phpMyAdmin на cPanel. Однак, коли я намагаюся імпортувати базу даних у навколишнє середовище, я постійно отримую цю помилку:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

Я спробував Google навкруги, і єдине рішення, яке я можу знайти, це одна помилка phpmysql - # 1273 - # 1273 - Невідоме зіставлення: 'utf8mb4_general_ci', яке на сьогоднішній день не дуже допомагає. Я спробував очистити файли cookie, але вони все ще не спрацюють. Будь ласка, допоможіть!


Яка версія WordPress? Дивіться make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade
Рік Джеймс

Відповіді:


107

У мене була така ж проблема, як і всі наші сервери запускають старіші версії MySQL. Це можна вирішити, запустивши сценарій PHP. Збережіть цей код у файлі та запустіть його, ввівши ім'я бази даних, користувача та пароль, і це змінить порівняння з utf8mb4/utf8mb4_unicode_ciнаutf8/utf8_general_ci

<!DOCTYPE html>
<html>
<head>
  <title>DB-Convert</title>
  <style>
    body { font-family:"Courier New", Courier, monospace; }
  </style>
</head>
<body>

<h1>Convert your Database to utf8_general_ci!</h1>

<form action="db-convert.php" method="post">
  dbname: <input type="text" name="dbname"><br>
  dbuser: <input type="text" name="dbuser"><br>
  dbpass: <input type="text" name="dbpassword"><br>
  <input type="submit">
</form>

</body>
</html>
<?php
if ($_POST) {
  $dbname = $_POST['dbname'];
  $dbuser = $_POST['dbuser'];
  $dbpassword = $_POST['dbpassword'];

  $con = mysql_connect('localhost',$dbuser,$dbpassword);
  if(!$con) { echo "Cannot connect to the database ";die();}
  mysql_select_db($dbname);
  $result=mysql_query('show tables');
  while($tables = mysql_fetch_array($result)) {
          foreach ($tables as $key => $value) {
           mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
     }}
  echo "<script>alert('The collation of your database has been successfully changed!');</script>";
}

?>

47
Це здається overkill vsmysqldump --compatible=mysql4
icc97

2
Для мене це спрацювало. Не забудьте назвати файлdb-convert.php
Fred K

1
Якщо ви зробите "localhost" вхід, це ідеально.
br4nnigan

2
mysqldump --compatible=mysql4або відповідь нижче - кращий варіант. Я не думаю, що це мудра ідея змінити щось подібне на живому сайті. Краще експортувати у правильному форматі, або якщо це не варіант, відредагуйте експортований файл.
Тиш

Ви просто врятували мені життя, і все, що я можу тобі дати, - це +1.
Тарук

229

Техніка на цій посаді працювала для мене

1) Клацніть на вкладці «Експорт» для бази даних

2) Клацніть перемикач "Спеціальна"

3) Перейдіть до розділу під назвою "Параметри для формату" та змініть спадне меню на "Система баз даних або старіший сервер MySQL, щоб максимально збільшити сумісність виводу з:" з NONE на MYSQL40.

4) Прокрутіть донизу та натисніть «GO».

Я не впевнений, якщо це спричинить втрату даних, однак за один раз, коли я це спробував, я не помітив жодної. Ніхто не відповідав на форумах, пов'язаних вище.

Редагувати 8.12.16 - Я вважаю, що експортування бази даних таким чином призводить до втрати даних, збережених у віджетах Black Studio TinyMCE Visual Editor , хоча я не провів кілька тестів для підтвердження.


не працювало для мене, я отримав помилку №1231 - змінну 'character_set_client' не можна встановити на значення 'NULL'
nerdess

Після декількох невдалих спроб інших рішень, цей відмінно працював над першою спробою.
Вінсент Полісі

НЕ працює з деякими новими сайтами Wordpress. При імпорті його на інший сервер він генерує цю помилку в першій таблиці, яку намагається імпортувати (wp_commentmeta) # 1064 - у вашому синтаксисі SQL виникла помилка; перевірте посібник, що відповідає вашій версії сервера MySQL, чи правильно використовувати синтаксис біля 'TYPE = MyISAM AUTO_INCREMENT = 1' у рядку 19
that-ben

це, схоже, не мало для мене ніякої різниці, все одно отримуючи ті самі повідомлення про помилки
pealo86

ви бос
Асель Ашраф

159

Якщо ви вже експортували .sqlфайл, найкраще зробити, це знайти та замінити наступне, якщо вони є у вашому файлі:

  • utf8mb4_0900_ai_ci до utf8_unicode_ci
  • utf8mb4 до utf8
  • utf8_unicode_520_ci до utf8_unicode_ci

Він замінить utf8mb4_unicode_ciна utf8_unicode_ci. Тепер ви переходите до свого phpMyAdmin cPanel і встановлюєте зіставлення БД utf8_unicode_ciчерез Операції> Збір .

Якщо ви експортуєте в файл .sql, краще змінити формат того, як ви експортуєте файл. Ознайомтеся з передвісником Евстера (він знаходиться на тій самій сторінці, що і ця)


2
він прекрасно працює разом із цим stackoverflow.com/a/30694416/1022726
iurii

Для всіх ваших людей Unix : sed -i.bak s/utf8mb4/utf8/g FILE_NAME. Це знайде всі події utf8mb4в FILE_NAME і замінить його utf8, зберігаючи копію оригінального файлу в FILE_NAME.bak. Вам може знадобитися налаштувати його, щоб вказати точну коаліцію у вашому випадку, але це початок :)
DaveLak

1
Мені також довелося замінити: utf8_unicode_520_ci на: utf8_unicode_ci
Нік Ріверс

Або через VI: vi dump.sqlа потім в с допомогою цього: :%s/uf8mb4/utf8/g.
Валентин Грегоар

2
і замінити utf8_0900_ai_ciнаutf8_unicode_ci
Ірфан Юсаніф

44

я використовую це в Linux:

sed -i 's/utf8mb4/utf8/g' your_file.sql
sed -i 's/utf8_unicode_ci/utf8_general_ci/g' your_file.sql
sed -i 's/utf8_unicode_520_ci/utf8_general_ci/g' your_file.sql

потім відновіть your_file.sql

mysql -u yourdBUser -p yourdBPasswd yourdB < your_file.sql

1
Там є коментар до іншої відповіді, яка тут повторюється. Версія OS X sed вимагає додаткового аргументу після прапора -i. Так sed -i '' ....працює.
Кент

2
Мені довелося також запустити це:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Майкл Хейс,

28

Wordpress 4.2 представив підтримку кодування символів "utf8mb4" з міркувань безпеки , але лише MySQL 5.5.3 і більше підтримують її. Спосіб обробки інсталятора (і оновлення) полягає в тому, що він перевіряє вашу версію MySQL, і ваша база даних буде оновлена ​​до utfmb4, тільки якщо вона підтримується .

Теоретично це звучить чудово, але проблема (як ви виявили) полягає в тому, що ви мігруєте бази даних з сервера MySQL, який підтримує utf8mb4 на той, який не працює. Хоча навпаки має працювати, це в основному одностороння операція.

Як зазначає Евстер, у вас може бути успіх за допомогою функції "Експорт" PHPMYAdmin. Використовуйте " Спосіб експорту: Спеціальний " та " Система баз даних або старіший сервер MySQL для максимальної сумісності виводу з: " виберіть спадне меню " MYSQL 40 ".

Для експорту командного рядка за допомогою mysqldump. Подивіться на прапор:

$ mysqldump --compatible=mysql4

Примітка. Якщо в базі даних є 4-байтні символи, вони будуть пошкоджені.

Нарешті, для всіх, хто використовує популярний плагін WP Migrate DB PRO, користувач у цій темі Wordpress.org повідомляє, що міграція завжди належним чином виконується, але мені не вдалося знайти нічого офіційного.

Плагін WP Migrate DB перекладає базу даних з одного зіставлення в інше, коли він переміщує 4,2 сайти між хостами з до- або пост-5.5.3 MySQL

Наразі, схоже, немає можливості відмовитися від оновлення бази даних. Отже, якщо ви використовуєте робочий процес, де ви переносите сайт з сервера або localhost з MySQL> 5.5.3 на той, який використовує старішу версію MySQL, вам може не пощастить.


Зміна сумісності на "MYSQL 40" повністю працювала для мене.
Keryn Gill

3
Якщо ви спробуйте імпортувати дамп, сумісний з mysql4, у базу даних публікації v5.5.3 (я використовую 5.5.28), це не вдасться, оскільки сценарій включає TYPE=MyISAMте, що було видалено в v5.1. Зробіть пошук і замініть на ENGINE=MyISAM. Я не міг розібратися з цим способом, використовуючи параметри mysqldumpвиводу.
icc97

26

У моєму випадку виявляється, мій
новий сервер працює MySQL 5.5,
старий сервер працює MySQL 5.6.
Тому я отримав цю помилку при спробі імпортувати .sqlфайл, який я експортував зі свого старого сервера.

MySQL 5.5 не підтримує utf8mb4_unicode_520_ci, але
MySQL 5.6.

Оновлення MySQL 5.6на новому сервері вирішило порівняння помилка!

Якщо ви хочете зберегти MySQL 5.5, ви можете:
- зробити копію експортованого .sqlфайлу
- замінити екземпляри utf8mb4unicode520_ciта utf8mb4_unicode_520_ci
... з utf8mb4_unicode_ci
- імпортувати оновлений .sqlфайл.


1
Так - завантаження до 5.6 є найпростішим рішенням для цього (а Ubuntu має mysql-server-5.6пакет, який ви можете встановити, який автоматично видалить 5.5).
Вільям Террелл

15

У wp-config.php є рядок:

define('DB_CHARSET', 'utf8mb4');

Якщо ви будете дотримуватися вказівок Markouver / Evster , не забудьте змінити цю лінію на виробничому сервері на

define('DB_CHARSET', 'utf8');

щоб виправити зламані 4-байтові символи


1
Також не забудьте також змінити define('DB_COLLATE', 'utf8_general_ci');. Це мені допомогло.
Абдухафіз

10

Після тривалих досліджень я знайшов рішення для вище:

  1. По-перше, ви змінюєте wp-config.php> База даних DB_CHARSET за замовчуванням на "utf8"

  2. Клацніть на вкладці "Експорт" для бази даних

  3. Клацніть перемикач "Спеціальна"

  4. Перейдіть до розділу під назвою "Параметри для певного формату" та змініть спадне меню на "Система баз даних або старіший сервер MySQL, щоб досягти максимальної сумісності виводу з:" від NONE до MYSQL40

  5. Прокрутіть донизу та натисніть кнопку «Перейти»

Тоді ви на.


7

Схоже, ваш хост не надає MySQL-версії, яка здатна запускати таблиці з порівнюванням utf8mb4.

Таблиці WordPress були змінені на utf8mb4 з версією 4.2 (випущена 23 квітня 2015 року) для підтримки Emojis, але для її використання вам потрібен MySQL 5.5.3. 5.5.3. є з березня 2010 року, тому зазвичай він повинен бути широко доступним. Ви можете перевірити, чи надає ваш хостинг цю версію?

Якщо ні, і оновлення неможливе, вам, можливо, доведеться шукати іншого хостера для запуску останніх версій WordPress (і ви завжди повинні робити це з міркувань безпеки).


1
Ви можете перевірити свою версію MySQL за допомогою командного рядка за допомогою "mysql -V"
Едд Сміт,

2

Тому я вирішив таким чином, від MySQL 5.6 до MySQL 5.5:

$ mysqldump -u username -p --compatible=mysql4 database_name > database_name.sql
$ sed -i 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql

(Необов’язково) Створіть .sql.gzфайл:

$ gzip database_name.sql 

Пояснення

$ mysqldump -u username -p --compatible=mysql4 database_name > database_name.sql

Як пояснено у цій відповіді , це лише еквівалент цього параметра від phpMyAdmin: "Система баз даних або старіший сервер MySQL для максимальної сумісності виводу з:" виберіть спадне меню "MYSQL 40" .

$ sed -i 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql

Нам це потрібно для вирішення цього питання:

ПОМИЛКА 1064 (42000) у рядку 18: у вас є помилка у вашому синтаксисі SQL; перевірте посібник, що відповідає вашій версії сервера MySQL, чи правильний синтаксис для використання біля "TYPE = InnoDB" у рядку 9


1
Зверніть увагу, якщо ви використовуєте версію ОС X X sed : $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql. Якщо ви хочете зберегти копію, як і database_name.sql.bakраніше, замініть sed:$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier

Ви також можете вбудувати в рядок sed.
Девідбіттон

Також якщо ви запускаєте mysqldump на MySQL 8, вам потрібно скористатися --compatible=ansiопцією
AbstractVoid


1

Найпростіший спосіб зробити це - експортувати свою базу даних .sql, відкрити її на Блокноті ++ і "Пошук і заміна" utf8mb4_unicode_ciна, utf8_unicode_ciа також замінити utf8mb4на utf8. Також не забудьте змінити посилання бази даних на utf8_unicode_ci(Операції> Збір).


0

відкрийте файл sql на Notepad ++ і ctrl + H. тоді ви ставите " utf8mb4" в пошук і " utf8" на заміну. Питання буде вирішено тоді.


У ньому написано "невідоме співставлення utf8"
Крістіан Трайна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.