PHP中的上标字符导致MySQLi选择查询找到0行

Saw*_*oes 5 php mysql mysqli superscript character-encoding

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

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

如果我在PHP中执行相同的完全查询,它将执行但会显示0 affected_rows.

这是我试过的:

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

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

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

Jon*_*hop 4

通过确保满足以下条件,您应该能够使查询正常工作:

##为 PHP 准备 UTF-8

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

header('Content-Type: text/html; charset=UTF-8');
Run Code Online (Sandbox Code Playgroud)

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

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Run Code Online (Sandbox Code Playgroud)

##为 MySQL 准备 UTF-8

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

SHOW VARIABLES LIKE 'character_set_system';
SHOW VARIABLES LIKE 'character_set_database';
Run Code Online (Sandbox Code Playgroud)

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

(CREATE | ALTER) DATABASE ... DEFAULT CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

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

SHOW CREATE TABLE myTable;
Run Code Online (Sandbox Code Playgroud)

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

(CREATE | ALTER) TABLE ... DEFAULT CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE ... CONVERT TO CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

使用此语句时要非常小心!如果表中已有 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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