如何在MySQL中转换包含latin1字符的WordPress UTF-8数据库

时间:2016-04-12 04:09:36

标签: php mysql wordpress encoding utf-8

我正在使用旧的WordPress数据库。在后端,一些帖子包含如下字符:

ü

但它们在前端显示为:

ü

在wp-config.php中更改define('DB_CHARSET', 'utf8');解决了这个特定问题,但是为了将来的兼容性(请参阅:https://make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade/),我认为按原样保留数据库并不是一个坏主意。想转换它。直接在PHP模板中输入ü无需更改任何内容即可运行。所以这显然是一个mySQL编码问题。

到目前为止,我已采取以下步骤:

  1. 从PHPMyAdmin运行以下命令:
  2. ALTER DATABASE MyDb CHARACTER SET utf8;

    ALTER TABLE wp_posts CHARACTER SET utf8;
    

    UPDATE wp_posts SET post_content = convert(cast(convert(post_content using latin1) as binary) using utf8)(取自此处:MySQL - Convert latin1 characters on a UTF8 table into UTF8

    我还使用了这个工具:https://interconnectit.com/products/search-and-replace-for-wordpress-databases/将所有表格转换为utf-8 mb4编码。

    alter table wp_posts change post_content post_content LONGTEXT CHARACTER SET latin1;
    alter table wp_posts change post_content post_content LONGBLOB;
    alter table wp_posts change post_content post_content LONGTEXT CHARACTER SET utf8;
    
    1. 我也试过这种方法: http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion

    2. 完全清空wp_posts并尝试输入新帖子。

    3. 通过所有这些方法,在创建新帖子并输入ü字符时,它仍会显示为ü

      此处的帖子也清楚地描述了我遇到的问题: https://wordpress.org/support/topic/trouble-converting-database-containing-special-characters-to-utf-8

      由于我完全陷入困境,因此非常感谢此处的任何建议或见解!

      由于

2 个答案:

答案 0 :(得分:0)

数据库和表声明只是未来表和列声明的默认值。

ALTER TABLE CHANGE ...更改声明而不转换编码。也就是说,这个可能让事情变得更糟。

首先,让我们验证你拥有的东西。请提供SHOW CREATE TABLE以获取感兴趣的表格。并为其中的某些数据提供此功能,这些数据应具有重音字符,例如ü

SELECT col, HEX(col) FROM tbl WHERE ...

如果HEX为FC,则表示您具有latin1编码。如果列显示CHARACTER SET latin1,则它们是一致的。 (所有latin1编码都是1个字节。)

如果HEX为C3BC,则表示您具有utf8编码。如果列显示CHARACTER SET utf8(或utf8mb4),则它们是一致的。 (重音字符的utf8编码通常是2个字节。)

如果编码和字符集不一致,那么恐慌。你有一个需要清理的烂摊子。

当“输入”数据时,有两件事是重要的:(1)字符的编码,以及(2)客户端认为编码的内容。编码取决于您获得角色的位置(键入方式,粘贴方式等)。您告诉客户端以各种方式告诉 mysqld编码是什么。 WordPress需要define('DB_CHARSET', 'utf8');; phpmyadmin需要其他东西。

只要您正确配置客户端,列CHARACTER SET是否相同无关紧要。转换将自动发生。 (但是,最好是在所有阶段保持一致 - utf8(或utf8mb4)。)

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;会主动更改该表所有列中的CHARACTER SET 字节。无论数据当前是latin1还是utf8,这都有效,但必须与声明一致(如上所述)。

答案 1 :(得分:0)

请使用代码转换您的WordPress数据库。只需更改代码中的相应部分即可...

<?php
error_reporting(E_ALL);
$dbname = "YOUR-DATABASE-NAME";
mysql_connect("localhost", "YOUR-DATABASE-USERNAME", "YOUR-DATABASE-PASSWORD") or die(mysql_error());
mysql_select_db("$dbname");
mysql_query("SET NAMES 'utf8';") or die(mysql_error());

$query = "SHOW TABLES";
$result = mysql_query($query) or die(mysql_error());
while ($data = mysql_fetch_assoc($result)) {

	$table = $data["Tables_in_$dbname"];
	$query = "alter table $table convert to character set utf8 collate utf8_turkish_ci";
	mysql_query($query) or die(mysql_error());
	echo "<b>$table</b><br>";

	$query = "SHOW COLUMNS FROM $table";
	$result_2 = mysql_query($query) or die(mysql_error());
	while ($columns = mysql_fetch_assoc($result_2)) {

		if (
				(stripos($columns['Type'], 'varchar')!==false)
				||
				(stripos($columns['Type'], 'text')!==false)
		) {
			$query = "ALTER TABLE $table MODIFY {$columns['Field']} {$columns['Type']} CHARACTER SET utf8 COLLATE utf8_turkish_ci";
			mysql_query($query) or die(mysql_error());
			echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{$columns['Field']}<br>";
		}
	}
}

echo "<hr><h1>Done!</h1>";