6

我正在使用 PHP 5.3.3 和 MySQL 5.1.61。有问题的列使用 UTF-8 编码,PHP 文件以 UTF-8 编码,没有 BOM。

在 Windows 上的 SQLyog 中使用 ² 字符执行 MySQLi 查询时,查询正确执行并显示正确的搜索结果。

如果我在 PHP 中执行同样的查询,它将执行但会显示 0 受影响的行。

这是我尝试过的:

  • 同时使用 LIKE 而不是 =
  • 将 PHP 文件的编码更改为 ANSI、UTF-8 without BOM 和 UTF-8
  • 在运行查询之前执行“SET NAMES utf-8”和“latin1”
  • 做了 header('Content-Type: text/html; charset=UTF-8'); 在 PHP 中
  • 使用 MySQLi::real_escape_string 转义
  • 做一个 filter_var($String, FILTER_SANITIZE_STRING)
  • 尝试了 MySQLi stmt 绑定

我能让它正常工作的唯一方法是,如果我将 ² 换成 % 并将 = 更改为 PHP 中的 LIKE。

使用²时如何在PHP中正确查询?

4

1 回答 1

4

通过确保以下内容,您应该能够使查询正常工作:

为 UTF-8 准备 PHP

您首先需要确保将发出这些查询的 PHP 页面作为 UTF-8 编码页面提供。这将确保正确显示来自数据库的任何 UTF-8 输出。在 Firefox 中,您可以通过访问您感兴趣的页面并使用“查看页面信息”菜单项来检查是否是这种情况。当你这样做时,你应该看到UTF-8作为页面的Encoding的值。如果页面不是以 UTF-8 格式提供的,您可以使用以下两种方法之一。您可以在对 的调用中设置编码header(),如下所示:

header('Content-Type: text/html; charset=UTF-8');

或者,您可以在页面块中使用meta标签:head

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

为 UTF-8 准备 MySQL

接下来,您需要确保将数据库设置为使用 UTF-8 编码。这可以在服务器、数据库、表或列级别进行设置。如果您在共享主机上,您可能只能控制层次结构的表和列级别。如果您可以控制服务器或数据库,则可以通过发出以下两个命令来检查它们使用的字符编码:

SHOW VARIABLES LIKE 'character_set_system';
SHOW VARIABLES LIKE 'character_set_database';

可以使用如下命令更改数据库级别的编码:

(CREATE | ALTER) DATABASE ... DEFAULT CHARACTER SET utf8;

要查看表使用的字符编码,只需执行以下操作:

SHOW CREATE TABLE myTable;

同样,以下是更改表级编码的方法:

(CREATE | ALTER) TABLE ... DEFAULT CHARACTER SET utf8;

我建议在层次结构中将编码设置得尽可能高。这样,您不必记住为新表手动设置它。现在,如果您的表的字符编码尚未设置为 UTF-8,您可以尝试使用如下alter语句对其进行转换:

ALTER TABLE ... CONVERT TO CHARACTER SET utf8;

使用此语句时要非常小心!如果您的表中已有 UTF-8 值,则在您尝试转换时它们可能会损坏。但是,有一些方法可以解决这个问题

强制 MySQLi 使用 UTF-8

最后,在连接到数据库之前,请确保发出适当的调用来说明您正在使用 UTF-8 编码。就是这样:

$db = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

// Change the character set to UTF-8 (have to do it early)
if(! $db->set_charset("utf8"))
{
    printf("Error loading character set utf8: %sn", $db->error);
}

一旦你这样做了,一切都应该按预期工作。您需要担心编码的唯一字符是 HTML 的 big 5: <, >, ', ", and &。您可以使用htmlspecialchars()函数来处理它。

如果您想了解更多信息(并获取其他资源的链接),请随时查看我撰写的有关此过程的文章。有两个部分:Unicode 和 Web:第 1 部分,以及Unicode 和 Web:第 2 部分。祝你好运!

于 2012-09-05T14:11:01.537 回答