MySQL 5 的 UTF8 问题

Posted

技术标签:

【中文标题】MySQL 5 的 UTF8 问题【英文标题】:UTF8 problem with MySQL 5 【发布时间】:2010-09-25 16:21:56 【问题描述】:

我正在将我的 WordPress 博客和 phpBB 论坛迁移到新的托管服务器中。我正在使用 phpMyAdmin 从上一个站点的数据库中导入 SQL 脚本。

当我用 Kate 打开 .sql 脚本时,它说它使用 UTF8 作为编码。当我在新服务器中导入sql时,我在phpMyAdmin中有选择编码的选项,默认选择utf8。

不过,当我完成导入数据库时​​,我直接在 phpMyAdmin 中阅读帖子文本,并看到诸如“é”、“ñ”等字符,这些字符还没有被“解释”并被替换为奇怪的字符已安装。

我可以看到我的 WordPress 安装也无法正常工作。显然这个编码有问题,但我认为问题出在 mysql 数据库或 phpMyAdmin 而不是 WordPress。

MySQL 的版本实际上是相同的,MySQL 5,但版本不同。还有,迁移论坛数据库的时候没有问题,所以这个就更奇怪了……

我不知道如何解决这个问题...欢迎任何想法。

【问题讨论】:

【参考方案1】:

你有没有尝试添加

SET NAMES 'utf8';

到你的 sql 转储?

utf8 或编码一般来说是为了成功,你必须确保:

文件采用 utf8 编码,无签名 mysql服务器默认编码设置为utf8 连接是 utf8(这就是您将 SET NAMES 'utf8' 放入 sql 文件的原因)。 所有表和列都有正确的编码和字符集 您的所有 web 文件也必须是 utf8 编码。而且只添加正确的标题是行不通的。您必须打开文件,检查编码是否为 utf8,如果不是,则剪切所有内容,将编码更改为 utf8,然后将所有内容粘贴回来。如果只是更改编码并保存文件,它不起作用!

【讨论】:

这是对要求的一个很好的总结,但是如果文件是 Latin1 并且您不粘贴非 Latin1 字符(即将它们编码为 £ 而不是),则最后一个不是必需的.我有很多遗留的 Latin1 材料仍然生成为有效的 UTF8,因为 Latin1 是 UTF8 的一个子集。所以迁移到 UTF8 并不是那么难。【参考方案2】:

非常感谢您的回答。我找到了解决方案,我觉得以前没有意识到它真的很愚蠢。一切都应该正常工作:

-文件用 utf8 编码 - 表是用 utf8 声明的:

SET character_set_client = utf8;
-MySQL 服务器配置了 utf8 等等。

一开始我没有意识到我正在使用 cPanel 备份向导中的数据库备份。当我意识到这一点时,我在旧服务器上使用 phpMyAdmin 导出数据库,将其导入新服务器,然后,问题修复了。

phpMyAdmin 比 cPanel 更了解 phpMyAdmin :P 显然 cPanel 导出脚本以便它与 cPanel 本身一起导入。这很可能也有效,但我更信任 phpMyAdmin。

非常感谢您的回答。

【讨论】:

【参考方案3】:

我刚刚遇到了同样的问题,因为我与它搏斗了大约一个小时,它破坏了我的许多网站,我想我会看看是否有其他人在努力解决它并发布解决方案:解决方案很简单就是在导入时指定导入字符集。

如果您可以通过 SSH 访问您的主机,首先再次将所有表再次删除到新数据库中,然后在 SSH 会话中运行此命令(假设您的旧转储文件是 olddatabase.dump.sql ):

$ mysql -h 主机 -u 用户名 -p 密码 --default-character-set=utf8 数据库 em>

这是解决问题的最简单、最直接的方法。

【讨论】:

以上是关于MySQL 5 的 UTF8 问题的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 5中列级别的CHARSET

mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql

如何在mysql中存取utf8mb4编码的字符

Mysql UTF8 编码问题 - “不正确的字符串值”

如何在mysql中存取utf8mb4编码的字符?

无法更改 MySQL 5.7 中的字符集(从拉丁语到 utf8)