# 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.