关于php:如何在数据库查询中保持字符编码

How to keep character encoding with database queries

我正在做以下事情。

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 编码的表。信息被转储进来。

当我在转移后检查表时,我得到如下记录:\\'?§,??,??,?–,??,??,?±,?°,??,??,? ?,??\\'。我不明白 UTF-8 字符串在进入数据库时??如何丢失其编码。我错过了一步吗?我是否需要运行某种函数来确保字符串被解析为 UTF-8?

安装系统后,我可以保存外语查询。只是传输搞砸了。

有什么想法吗?


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

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

另一个选项是目标表不是 UTF-8。


不清楚您是如何执行所有这些步骤的,但让我们试一试。

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

其次,在插入任何数据之前,请执行以下查询:

1
SET NAMES 'utf8';

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

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