# 1273 - Неизвестное сопоставление: 'utf8mb4_unicode_ci' cPanel


183

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

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

Я попытался поискать в Google, и единственное решение, которое я могу найти, это ошибка phpmysql - # 1273 - # 1273 - Неизвестное сопоставление: 'utf8mb4_general_ci', которое, к настоящему времени, не сильно помогает. Я пытался очистить куки, но он все равно не работает. Пожалуйста помоги!


Ответы:


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
Это похоже на перебор противmysqldump --compatible=mysql4
icc97

2
Для меня это сработало. Не забудьте назвать файлdb-convert.php
Фред К

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
тот-бен

это, казалось, не имело никакого значения для меня, все еще получая те же самые сообщения об ошибках
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через Операции> Параметры сортировки .

Если вы экспортируете в a .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
Есть комментарий к другому ответу, который стоит повторить здесь. Версия sed для OS X требует дополнительного аргумента после флага -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 сайта между хостами с MySQL до или после 5.5.3.

В настоящее время нет возможности отказаться от обновления базы данных. Поэтому, если вы используете рабочий процесс, при котором вы переносите сайт с сервера или локального хоста с MySQL> 5.5.3 на тот, который использует более старую версию MySQL, вам может не повезти.


Изменение совместимости на «MYSQL 40» полностью сработало для меня.
Керин Гилл,

3
Если вы затем попытаетесь импортировать совместимый с mysql4 дамп в базу данных post 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');

Если вы следуете инструкциям Маркувера / Евстера , не забудьте изменить эту строку на производственном сервере на

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»
Edd Smith

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 для максимальной совместимости вывода с:» dropdown select «MYSQL 40» .

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

Нам нужно это, чтобы решить эту проблему:

ОШИБКА 1064 (42000) в строке 18: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'TYPE = InnoDB' в строке 9


1
Обратите внимание , если вы используете версию OS X в СЭД: $ 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
Джастин Фортье

Вы также можете встроить sed.
Давидбиттон

Также, если вы используете mysqldump на MySQL 8, вам нужно использовать --compatible=ansiопцию
AbstractVoid

1

Я также испытал эту проблему. Решением, которое работало для меня, было открытие локальной базы данных с Sequel Pro и обновление Encoding and Collation до utf8 / utf8_bin для каждой таблицы перед импортом.


1

Самый простой способ сделать это экспортировать свою базу данных .sql, откройте его в блокноте ++ и «Поиск и Заменить» , utf8mb4_unicode_ciчтобы utf8_unicode_ciи также заменить utf8mb4на utf8. Также не забудьте изменить параметры сортировки базы данных на utf8_unicode_ci(Операции> Параметры сортировки).


0

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.