Php 已将数据库转储从latin1 db导入utf8数据库

Php 已将数据库转储从latin1 db导入utf8数据库,php,mysql,encoding,Php,Mysql,Encoding,当我从mysql v4.0.21对数据库进行mysql转储并将其导入新服务器mysql v5.0.45时,我使用了iconv将latin1转换为utf8 它在旧服务器上是latin1,在新服务器上是utf8,所以我在mysql转储上运行了它:iconv−f拉丁语1−UTF−8 quickwebcms_2010-03-01.sql 它运行成功,然后我将其导入新服务器 现在,当它打印出我的PHP应用程序中的一些数据时,它会显示问题(?)标记(例如:学院的)和学院的) 我导出了这些字符出现在其中的表,

当我从mysql v4.0.21对数据库进行mysql转储并将其导入新服务器mysql v5.0.45时,我使用了
iconv
将latin1转换为utf8

它在旧服务器上是latin1,在新服务器上是utf8,所以我在mysql转储上运行了它:
iconv−f拉丁语1−UTF−8 quickwebcms_2010-03-01.sql

它运行成功,然后我将其导入新服务器

现在,当它打印出我的PHP应用程序中的一些数据时,它会显示问题(
)标记(例如:
学院的
)和
学院的

我导出了这些字符出现在其中的表,并在textmate中查找并替换了所有字符,然后将其导入到新数据库中,并将一些字段上载为null,因此查找和替换可能会在过程中出错。我将表csv保存为utf8,没有bom,只有utf8,它仍然做同样的事情


感谢您提供有关发生这种情况的任何帮助。

您最好将数据以latin1的形式加载到新服务器上,然后在每个表上使用适当的
ALTER TABLE tablename CONVERT to CHARACTER SET utf8 DEFAULT COLLATION utf8\U unicode\U ci
(或者使用某种脚本)


或者您可以先转换,然后转储。

IIRC,
mysqldump
默认情况下生成UTF-8输出,而不管数据库的编码是什么。中的用户评论似乎证实了这一点:

我只是使用默认的字符集-通常是拉丁文1。然而,mysqldump生成的转储文件可能是utf8格式的,这可能令人惊讶。这似乎很好,但会给mysqldump的--skip opt选项带来麻烦,它关闭--set字符集,但将转储保留在utf8中

也许mysqldump默认使用utf8的事实,以及--set charset选项的重要性应该更突出地记录下来(请参阅--default character set属性的文档,了解当前提到的utf8的使用)


尝试跳过iconv步骤,可能马上就能工作。

如果表的内容都正常(并且在UTF-8中),并且Web应用程序中有“坏”字符,请确保MySQL连接在PHP脚本中使用UTF-8字符集。即使您的数据库和表是UTF-8,MySQL在默认情况下也使用拉丁连接(至少在我的共享服务器配置中)。因此,您必须告诉MySQL以UTF-8格式发送内容。否则,它会将其转换为拉丁语,在UTF-8网页中产生“坏”字符

如果可用,请使用,否则您可以使用SQL查询进行设置(如果可用,请始终使用mysql\u set\u charset):

还要确保(X)HTML标记也使用UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

请参见
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">