从latin1 db导入数据库转储到utf8数据库

时间:2010-03-01 16:21:16

标签: php mysql encoding

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

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

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

现在它显示问题(?)标记(例如:College?s)和Â(例如:CollegeÂ’s),当它打印出PHP中的一些数据时应用

我导出了这些字符显示的表格并在textmate中进行了查找和替换,然后将其导入到新数据库中,并将一些字段上传为null,因此查找和替换可能会搞砸某些东西进行中。我把表csv保存为utf8 no bom,只是utf8,它仍然做同样的事情。

对于为什么会发生这种情况的任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

IIRC,mysqldump默认生成UTF-8输出,无论数据库的编码是什么。 mySQL manual中的此用户评论似乎已确认:

  

我只是使用默认字符集 - 通常是latin1。但是,mysqldump产生的转储,或许令人惊讶的是,在utf8中。这看起来很好,但是导致mysqldump的--skip-opt选项出现问题,它关闭了--set-charset但是在utf8中保留了转储。

     

也许mysqldump默认使用utf8这一事实,并且--set-charset选项的重要性应该更加突出地记录(参见当前提及使用的--default-character-set属性的文档) of utf8)

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

答案 1 :(得分:1)

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

如果可用,请使用mysql_set_charset,否则可以使用SQL查询进行设置(如果可用,请始终使用mysql_set_charset):

if (function_exists('mysql_set_charset'))
    mysql_set_charset('utf8', $conn);
else
{
    if (mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn) === false)
    {
        //Error! Do something...
    }
}

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

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

答案 2 :(得分:0)

您可能最好将数据作为latin1加载到新服务器上,然后在每个表上使用相应的ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 DEFAULT COLLATION utf8_unicode_ci(或者使用某种类型的脚本为您执行此操作)。

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

相关问题