#1273 - 未知排序规则:'utf8mb4_unicode_ci' cPanel

#1273 - Unknown collation: 'utf8mb4_unicode_ci' cPanel

我在本地计算机上有一个 WordPress 数据库,我想将其传输到 cPanel 上的托管 phpMyAdmin。但是,当我尝试将数据库导入环境时,我不断收到此错误:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

我已经尝试 Google 了,但我能找到的唯一解决方案是这个 phpmysql error - #1273 - #1273 - Unknown collation: 'utf8mb4_general_ci',到目前为止,它并没有太大帮助。我已尝试清除 cookie,但仍然无法正常工作。请帮忙!

您的主机似乎没有提供能够 运行 具有 utf8mb4 排序规则的表的 MySQL 版本。

WordPress 表格已更改为 utf8mb4 版本 4.2(2015 年 4 月 23 日发布)以支持表情符号,但 you need MySQL 5.5.3 to use it. 5.5.3。是从 2010 年 3 月开始的,所以它通常应该广泛可用。 Cna 你检查你的主机是否提供那个版本?

如果没有,并且无法升级,您可能需要寻找其他主机以 运行 最新的 WordPress 版本(出于安全原因,您应该始终这样做)。

我也遇到过这个问题。对我有用的解决方案是在导入之前为每个 table 打开本地数据库 Sequel Pro and update Encoding and Collation 到 utf8/utf8_bin。

我遇到了与我们所有服务器 运行 旧版本 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>";
}

?>

The technique in this post worked for me

1) 单击数据库的 "Export" 选项卡

2) 单击 "Custom" 单选按钮

3) 转到标题为 "Format-specific options" 的部分并将 "Database system or older MySQL server to maximize output compatibility with:" 的下拉列表从 NONE 更改为 MYSQL40。

4) 滚动到底部并单击 "GO"。

我不确定这样做是否会导致任何数据丢失,但是我曾经尝试过一次,但没有注意到任何数据丢失。在上面链接的论坛中回复的人也没有。

编辑 2016 年 8 月 12 日 - 我相信以这种方式导出数据库会导致我丢失保存在 Black Studio TinyMCE Visual Editor 小部件中的数据,尽管我没有 运行 多次测试确认。

Wordpress 4.2 为 security reasons 引入了对 "utf8mb4" 字符编码的支持,但只有 MySQL 5.5.3 及更高版本支持它。安装程序(和更新程序)处理此问题的方式是检查您的 MySQL 版本,并且您的数据库将升级到 utfmb4 仅当它受支持时

这在理论上听起来不错,但问题(正如您所发现的)是当您将数据库从支持 utf8mb4 的 MySQL 服务器迁移到不支持 utf8mb4 的服务器时。虽然反过来应该可行,但它基本上是一种单向操作。

正如 Evster 指出的那样,您 可能 使用 PHPMYAdmin 的 "Export" 功能取得成功。使用“Export Method: Custom”和“Database system or older MySQL server to maximize output compatibility with:” dropdown select "MYSQL 40".

对于使用 mysqldump 的命令行导出。看看旗帜:

$ mysqldump --compatible=mysql4

注意:如果数据库中有任何 4 字节字符,它们将被损坏。

最后,对于使用流行的 WP Migrate DB PRO 插件的任何人,a user in this Wordpress.org thread 报告迁移始终得到正确处理,但我找不到任何官方信息。

The WP Migrate DB plugin translates the database from one collation to the other when it moves 4.2 sites between hosts with pre- or post-5.5.3 MySQL

目前,似乎没有选择退出数据库更新的方法。因此,如果您正在使用从中迁移网站的工作流程 MySQL > 5.5.3 的服务器或本地主机到使用旧 MySQL 版本的服务器或本地主机,你可能会倒霉。

wp-config.php中有一行:

define('DB_CHARSET', 'utf8mb4');

如果您遵循 / 说明,请不要忘记将生产服务器上的这一行更改为

define('DB_CHARSET', 'utf8');

为了修复损坏的 4 字节字符

如果您已经导出 .sql 文件,最好的办法是查找并替换以下内容(如果您的文件中有以下内容):

  • utf8mb4_0900_ai_ciutf8_unicode_ci
  • utf8mb4utf8
  • utf8_unicode_520_ciutf8_unicode_ci

它将 utf8mb4_unicode_ci 替换为 utf8_unicode_ci。现在您转到 phpMyAdmin cPanel 并通过 Operations > Collat​​ion.

将数据库排序规则设置为 utf8_unicode_ci

如果您要导出到 .sql,最好更改导出文件的格式。查看 (与此位于同一页面)

经过长时间的研究,我找到了解决上述问题的方法:

  1. 首先更改 wp-config.php> 数据库 DB_CHARSET 默认值 至 "utf8"

  2. 单击数据库的 "Export" 选项卡

  3. 单击 "Custom" 单选按钮

  4. 转到标题为 "Format-specific options" 的部分并更改 “数据库系统或更旧的 MySQL 服务器的下拉列表以最大化 输出兼容性:" 从 NONE 到 MYSQL40.

  5. 滚动到底部并点击前往

那你就上了。

最简单的方法是将数据库导出到 .sql,在 Notepad++ 上打开它,然后 "Search and Replace" 将 utf8mb4_unicode_ci 更改为 utf8_unicode_ci 并替换 utf8mb4utf8。另外不要忘记将数据库排序规则更改为 utf8_unicode_ci(操作 > 排序规则)。

于是我就这样解决了,从MySQL5.6到MySQL5.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 中的此选项等效:"Database system or older MySQL server to maximize output compatibility with:" 下拉列表 select "MYSQL 40".

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

我们需要这个来解决这个问题:

ERROR 1064 (42000) at line 18: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=InnoDB' at line 9

就我而言,结果是我的
新服务器是 运行 MySQL 5.5,
旧服务器是 运行 MySQL 5.6.
所以我在尝试导入从旧服务器导出的 .sql 文件时遇到了这个错误。

MySQL5.5不支持utf8mb4_unicode_520_ci,但是
MySQL 5.6 分。

在新服务器上更新到 MySQL 5.6 解决了整理错误!

如果想保留MySQL5.5,可以:
- 复制导出的 .sql 文件
- 替换 utf8mb4unicode520_ciutf8mb4_unicode_520_ci
的实例 ...utf8mb4_unicode_ci
- 导入更新后的 .sql 文件。

我在 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
sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql

然后恢复 your_file.sql

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

在 Notepad++ 上打开 sql 文件并 ctrl + H. 然后你把“utf8mb4”放在搜索上,把“utf8”放在替换上。 问题将在那时得到解决。

如果您使用的是 PHP7,那么您需要像这样的 PHP 脚本来迁移您的排序规则:

<!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'];

  $mysqli = new mysqli('db',$dbuser,$dbpassword);
  if ($mysqli -> connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
    exit();
  }
  $mysqli -> select_db($dbname);
  $result= $mysqli->query('show tables');
  while($tables = $result->fetch_array) {
          foreach ($tables as $key => $value) {
           $mysqli->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>";
}

?>