【问题标题】:Handling character encoding from Java to PHP to MySQL处理从 Java 到 PHP 到 MySQL 的字符编码
【发布时间】:2013-04-30 23:25:34
【问题描述】:

在 Java 中,我将 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è(或其他)时,它返回空。

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

【问题讨论】:

  • 你应该使用存储过程而不是你的 php 代码中的 SQL,如果你不小心可能会导致 sql 注入攻击

标签: java php mysql character-encoding


【解决方案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';

  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 包含一些变音字符)应该告诉您在将值存储到表时是否使用了 UTF-8

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

【讨论】:

  • 字符串来自 Java。它没有被专门设置为 Java OR php 中的一种编码类型。另外,我正在通过phpmyadmin“验证”这一点。那么也许这没有帮助?我的排序规则在所有MySQL 表中设置为utf_general_ci
  • 谢谢!非常彻底。等我可以测试后再联系你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多