我正在使用旧的WordPress数据库。在后端,一些帖子包含如下字符:
ü
但它们在前端显示为:
ü
在wp-config.php中更改define('DB_CHARSET', 'utf8');
解决了这个特定问题,但是为了将来的兼容性(请参阅:https://make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade/),我认为按原样保留数据库并不是一个坏主意。想转换它。直接在PHP模板中输入ü
无需更改任何内容即可运行。所以这显然是一个mySQL编码问题。
到目前为止,我已采取以下步骤:
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;
我也试过这种方法: http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion
完全清空wp_posts并尝试输入新帖子。
通过所有这些方法,在创建新帖子并输入ü
字符时,它仍会显示为ü
。
此处的帖子也清楚地描述了我遇到的问题: https://wordpress.org/support/topic/trouble-converting-database-containing-special-characters-to-utf-8
由于我完全陷入困境,因此非常感谢此处的任何建议或见解!
由于
答案 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 " {$columns['Field']}<br>";
}
}
}
echo "<hr><h1>Done!</h1>";