1

在 Java 中,我将 a 传递String给 PHP。

在 PHP 中,我使用该字符串并通过查询对其进行MySQL搜索。

这是php代码:

    $query = $database->escape_value(trim($_POST['query'])); 
    $result = mysqli_query($dbconnection, Data::getSearchQuery($query));
    while ($row = mysqli_fetch_assoc($result)) {
        $output[] = $row;
    }
    print(json_encode($output));

    mysqli_close($dbconnection);


  public static function getSearchQuery($item_query) {

        $query = "
            SELECT i.item, i.item_id, c.category, c.cat_id
            FROM items as i
            LEFT JOIN master_cat AS c
                    ON (c.cat_id = i.cat_id)
            WHERE i.item LIKE '%{$item_query}%' 

            ORDER BY i.item ASC;";

        return $query;
    }

如果我在美式键盘上使用常规字符,这总是有效的。但是当我开始使用不规则字符时,搜索变成了空的。

我可以验证MySQL在用户输入数据时存储数据。因此,如果他们键入Beyoncè,这就是数据库存储它的方式。

但是当我在上面的代码中搜索Beyoncè(或其他)时,它返回空。

我应该如何处理字符。在这里编码?

4

1 回答 1

1

思考三点:

1)$item_query变量可能编码错误。

2) >>我可以验证 MySQL 在用户输入数据时存储数据

这可能会变得棘手。如果将 iso8859-1 编码的字符串写入 utf-8 数据库,则该字符串显然存储不正确。如果使用配置为 iso8859-1 的客户端(即 phpmyadmin 或 mysql 命令行工具)读取该字符串,则会正确返回该字符串——尽管它在数据库中的表示显然是错误的。

3) MySql 设置:是否为连接本身设置了 utf-8?数据库/表的字符集和排序规则呢?

https://dev.mysql.com/doc/refman/5.5/en/charset-syntax.html

更新: 我假设你希望一切都是 UTF-8。一种快速破解测试:

  • Beyoncé有 7 个字符(参见 MySQL CHAR_LENGTH 函数)
  • 在 UTF-8 中,它占用 8 个字节(参见 MySQL LENGTH 函数)。这八个字节以每个字符一个字节的编码表示,例如 windows-1252,类似于Beyoncé.

这导致以下诊断测试......

  1. PHP 发出的 SQL 命令

    "SELECT CHAR_LENGTH($item_query), LENGTH($item_query);"
    

    然后应该返回 (7, 8) 的结果,以向我们表明$item_query 变量可能已正确编码并且数据库喜欢 UTF-8。(7, 7) 表示 $item_query 不是 UTF-8,而 (8, 8) 表示数据库还不想处理 UTF-8。如果是后者,那么也许SET NAMES 'UTF8';在查询之前发出 a 。

  2. 同样,PHP 发出的 SQL 命令

    SELECT CHAR_LENGTH('Beyoncé'), LENGTH('Beyoncé');
    

    应该返回结果 (7, 8) 向我们表明您的 PHP 编辑器已配置为编辑 UTF-8 php 文件

  3. 对 phpmyadmin(或任何 SQL 客户端)重复上一步,以确保该客户端也使用 UTF-8

  4. 还没有涉及到任何表!SQL 命令

    SELECT CHAR_LENGTH(somecolumn), LENGTH(somecolumn) FROM sometable;
    

    ( sometable 具有 UTF-8 字符编码和 somecolumn 包含一些变音字符)应该告诉您在将值存储到 table 时是否使用了 UTF-8

  5. 如果之前的所有测试都通过了,请使用 LIKE 再次测试。甚至'Beyoncé' LIKE 'Beyonce'应该工作。更多信息,谷歌 MySQL 排序规则。

于 2013-05-01T00:14:48.893 回答