#1273-未知排序规则:“ UTF8MB4_Unicode_CI ” cPanel

我在本地机器上有一个WordPress数据库,我想将其转移到cPanel上的托管phpMyAdmin.但是,当我尝试将数据库导入到环境中时,总是出现以下错误:

#1273 - Unknown collation: 'utf8mb4_unicode_ci'

我试着在谷歌上搜索,我能找到的唯一解决方案是这个PHPMYSQL错误-#1273-#1273-未知排序规则:';UTF8MB4_通用_CI';,到目前为止没有多大帮助。我试过清除饼干,但还是不行。请帮助!

393943 次浏览

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

WordPress表格在4.2版本(2015年4月23日发布)中更改为UTF8MB4,以支持表情符号,但您需要MySQL 5.5.3才能使用它。 5.5.3。是从2010年3月开始的,所以它通常应该被广泛使用。你能检查一下你的主机服务商是否提供那个版本吗?

如果没有,并且升级是不可能的,你可能不得不寻找另一个主机来运行最新的WordPress版本(出于安全原因,你应该总是这样做)。

我也经历过这个问题。我的解决方案是使用续集专业版打开本地数据库,并在导入之前将每个表的编码和整理更新为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>";
}


?>

这篇文章中的技巧对我很有效。

1)单击数据库的“导出”选项卡

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

3)转到标题为“ Format-Specific Options ”的部分,并将“ Database System or older MySQL Server to maximize output compatibility with:”的下拉列表从None更改为MySQL40。

4)滚动到底部并单击“ Go ”。

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

编辑8/12/16——我认为以这种方式导出数据库会导致我丢失保存在黑色工作室TinyMCE可视化编辑器小部件中的数据,尽管我还没有运行多个测试来确认。

WordPress4.2引入了对安全原因的“ utf8mb4 ”字符编码的支持,但只有MySQL5.5.3和更高版本支持它。安装程序(和更新程序)处理此问题的方式是,它检查您的MySQL版本,并且您的数据库将升级到UTFMB4除非它得到支持。

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

正如Evster所指出的,使用phpMyAdmin的“导出”特性,您__获得成功。使用“导出方法:自定义 ”,并在“数据库系统或较旧的MySQL服务器,以最大限度地提高输出兼容性: ”下拉菜单中选择“MySQL 40 ”。

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

$ mysqldump --compatible=mysql4

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

最后,对于任何使用流行的WP Migrate DB Pro插件的人来说,此WordPress.org主题中的用户报告说迁移总是被正确处理,但我找不到任何官方的东西。

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

目前,似乎没有退出数据库更新的方法。因此,如果您使用的是迁移站点的工作流, 从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并将数据库排序规则设置为utf8_unicode_ci操作>排序规则

如果要导出到.sql,最好更改导出文件的格式。查看埃夫斯特的回答(与此在同一页中)

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

  1. 首先,更改WP-config.PHP>Database DB_字符集的默认值。 到“ UTF8 ”

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

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

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

  5. 滚动到底部并单击Go

那你就上吧。

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

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

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

第18行的错误1064(42000):您的SQL语法中有错误。查看与您的MySQL服务器版本对应的手册,了解在第9行的“ type=innodb ”附近使用的正确语法

在我的情况下,结果是我的
新服务器正在运行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
的实例 ...__为ABC0
-导入更新的.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

然后恢复_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>";
}


?>