2010-04-13 69 views
1

我正在做以下。如何保持字符编码与数据库查询

1)我导出数据库并将其保存到名为dump.sql的文件中。 2)然后通过PHP ftp将文件传输到不同的服务器。 3)成功传输文件后,管理员可以选择在新主机上运行“dbtransfer”脚本。 4)该脚本打开脚本并逐行运行查询。

这很好 - 但是外语编码有问题。我们正在使用UTF-8。

第1步:这工作正常,文件是以UTF-8格式。 第3步:当我使用mb_check_encoding()测试dump.sql文件的内容时。该字符串以UTF-8形式返回。 第4步:这将创建具有utf8_general_ci编码的表。这些信息被转存。

当我在传输后查看表格时,我收到了这样的记录:'ç,LJ,ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà ,AY,AZ”。我不明白UTF-8字符串在进入数据库时​​如何失去其编码。我错过了一步吗?我是否需要运行某种函数来确保字符串被解析为UTF-8?

一旦系统安装,我可以保存外语查询。这只是转移,搞乱了。

任何想法?

回答

1

它不清楚你如何做所有这些步骤,但让我们试试看。

首先,确保与字符集相关的所有数据库连接设置都设置为utf-8。在数据库方面有一些,在客户端有一些。

其次,插入任何数据之前,请执行下列操作查询:

SET NAMES 'utf8'; 
1

最有可能的是,您没有告诉MySQL您正在使用UTF-8进行通信 - 连接的字符集是错误的。为此,使用mysql_set_charset函数。

另请注意,utf8_general_ci不是一种编码 - 它是一种排序规则。换句话说,它仅告诉MySQL在比较值时(包括何时进行排序)如何处理该列。

2

之后我连接到一个数据库中的PHP我总是执行连接对象下面的查询,以确保连接是使用UTF-8 :

$pdo->exec('SET NAMES \'utf8\' COLLATE \'utf8_unicode_ci\''); 

另一种选择是目标表不是UTF-8。