【问题标题】:#1273 - Unknown collation: 'utf8mb4_unicode_ci' cPanel#1273 - 未知排序规则:'utf8mb4_unicode_ci' cPanel
【发布时间】:2015-07-07 03:18:39
【问题描述】:

我的本​​地机器上有一个 WordPress 数据库,我想将它转移到 cPanel 上的托管 phpMyAdmin。但是,当我尝试将数据库导入环境时,我不断收到此错误:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

我试过用谷歌搜索,我能找到的唯一解决方案是这个phpmysql error - #1273 - #1273 - Unknown collation: 'utf8mb4_general_ci',到目前为止没有太大帮助。我试过清除cookies,但还是不行。请帮忙!

【问题讨论】:

标签: mysql wordpress phpmyadmin cpanel


【解决方案1】:

我在 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

【讨论】:

  • 对另一个答案有评论,这里需要重复。 OS X 版本的 sed 在 -i 标志之后需要一个额外的参数。所以sed -i '' .... 有效。
  • 我也必须运行它:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
  • -i 标志仅表示就地替换,因此不生成新文件
【解决方案2】:

如果您使用的是 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>";
}

?>

【讨论】:

    【解决方案3】:

    如果您已经导出了一个.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 将 DB 排序规则设置为 utf8_unicode_ci

    如果您要导出到.sql,最好更改导出文件的格式。查看Evster's anwer(与此在同一页面中)

    【讨论】:

    • 它和这个stackoverflow.com/a/30694416/1022726一起工作得很好
    • 所有 Unix 用户:sed -i.bak s/utf8mb4/utf8/g FILE_NAME。这将在 FILE_NAME 中找到所有出现的 utf8mb4,并将其替换为 utf8,同时将原始文件的副本保存到 FILE_NAME.bak。您可能需要对其进行调整以在您的情况下指定确切的联盟,但这是一个开始:)
    • 我还必须将:utf8_unicode_520_ci 替换为:utf8_unicode_ci
    • 或通过 vi:vi dump.sql,然后通过执行此操作::%s/uf8mb4/utf8/g
    • 并将utf8_0900_ai_ci替换为utf8_unicode_ci
    【解决方案4】:

    我遇到了同样的问题,因为我们所有的服务器都运行旧版本的 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>";
    }
    
    ?>
    

    【讨论】:

    • 这对mysqldump --compatible=mysql4来说似乎有点矫枉过正
    • 对我来说它有效。记得将文件命名为db-convert.php
    • 如果您将 'localhost' 作为输入,那就完美了。
    • mysqldump --compatible=mysql4 或下面的答案是更好的选择。我认为在实时站点上更改此类内容不是一个明智的主意。最好以正确的格式导出,或者如果这不是一个选项,请编辑导出的文件。
    • 所以你刚刚救了我的命,我能给你的 rn 就是 +1。
    【解决方案5】:

    在记事本++和ctrl + H.上打开sql文件 然后你把“utf8mb4”放在搜索上,把“utf8”放在替换上。 届时该问题将得到解决。

    【讨论】:

    • 它说“unknown collat​​ion utf8”
    【解决方案6】:

    就我而言,结果是我的
    新服务器正在运行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_ciutf8mb4_unicode_520_ci 的实例
    ...与utf8mb4_unicode_ci
    - 导入您更新的.sql 文件。

    【讨论】:

    • 是的 - 上传到 5.6 是最简单的解决方案(Ubuntu 有一个可以安装的 mysql-server-5.6 软件包,它会自动为您删除 5.5)。
    【解决方案7】:

    所以我就这样解决了,从 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
    

    正如answer 中所解释的,这与 phpMyAdmin 中的此选项等效:“数据库系统或较旧的 MySQL 服务器以最大程度地输出兼容性:”下拉选择“MYSQL 40”

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

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

    第 18 行的 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 9 行的“TYPE=InnoDB”附近使用正确的语法

    【讨论】:

    • 请注意,如果您使用的是 OS X 版本的 sed:$ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql。如果您想在 sed 替换之前将副本保留为 database_name.sql.bak$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
    • 你也可以内联sed
    • 另外,如果你在 MySQL 8 上运行 mysqldump,你需要使用 --compatible=ansi 选项
    【解决方案8】:

    最简单的方法是将数据库导出到.sql,在记事本++ 上打开它,然后“搜索并替换”utf8mb4_unicode_ciutf8_unicode_ci,并将utf8mb4 替换为utf8。另外不要忘记将数据库排序规则更改为 utf8_unicode_ci(操作 > 排序规则)。

    【讨论】:

      【解决方案9】:

      The technique in this post worked for me

      1) 点击数据库的“导出”标签

      2) 点击“自定义”单选按钮

      3) 转到标题为“特定于格式的选项”的部分,并将“数据库系统或较旧的 MySQL 服务器以最大程度地输出与以下内容的兼容性”的下拉列表从 NONE 更改为 MYSQL40。

      4) 滚动到底部并点击“GO”。

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

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

      【讨论】:

      • 对我不起作用,我收到错误 #1231 - 变量 'character_set_client' 不能设置为 'NULL' 的值
      • 在多次尝试其他解决方案失败后,这个解决方案在第一次尝试时效果很好。
      • 不适用于一些新的 Wordpress 网站。在另一台服务器上导入它时,它会在它尝试导入的第一个表上生成此错误 (wp_commentmeta) #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 19 行的“TYPE=MyISAM AUTO_INCREMENT=1”附近使用正确的语法
      • 这对我来说似乎没有任何区别,仍然收到相同的错误消息
      • 你是老板
      【解决方案10】:

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

      1. 首先你改变 wp-config.php> 数据库 DB_CHARSET 默认值 转为“utf8”

      2. 单击数据库的“导出”选项卡

      3. 单击“自定义”单选按钮

      4. 转到标题为“格式特定选项”的部分并更改 “数据库系统或较旧的 MySQL 服务器以最大化 输出兼容性:" 从 NONE 到 MYSQL40。

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

      那么你就开始了。

      【讨论】:

        【解决方案11】:

        wp-config.php中有一行:

        define('DB_CHARSET', 'utf8mb4');
        

        如果您按照Markouver's / Evster's 的说明进行操作,请不要忘记将生产服务器上的这一行更改为

        define('DB_CHARSET', 'utf8');
        

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

        【讨论】:

        • 另外不要忘记修改define('DB_COLLATE', 'utf8_general_ci');。这对我有帮助。
        【解决方案12】:

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

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

        正如 Evster 所指出的,您可能使用 PHPMYAdmin 的“导出”功能会成功。使用“导出方法:自定义”,对于“数据库系统或较旧的 MySQL 服务器,以最大限度地兼容输出:”下拉菜单选择“MYSQL 40 ”。

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

        $ mysqldump --compatible=mysql4
        

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

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

        当使用 5.5.3 之前或之后的 MySQL 在主机之间移动 4.2 站点时,WP Migrate DB 插件会将数据库从一种排序规则转换为另一种排序规则

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

        【讨论】:

        • 将兼容性更改为“MYSQL 40”对我来说完全有效。
        • 如果您尝试将 mysql4 兼容转储导入到 v5.5.3 后的数据库(我使用的是 5.5.28),那么它会失败,因为脚本包含在 v5 中删除的 TYPE=MyISAM。 1.搜索并替换为ENGINE=MyISAM。我无法使用mysqldump 输出选项解决此问题。
        【解决方案13】:

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

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

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

        【讨论】:

        • 您可以通过命令行使用“mysql -V”检查您的MySQL版本
        【解决方案14】:

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

        【讨论】:

          猜你喜欢
          • 2017-07-12
          • 2014-02-07
          • 2018-01-29
          • 1970-01-01
          • 2018-12-19
          相关资源
          最近更新 更多