繁体   English   中英

处理从Java到PHP到MySQL的字符编码

[英]Handling character encoding from Java to PHP to MySQL

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

在PHP中,我使用该String并使用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è这种方式存储它。

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

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

需要考虑三点:

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é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; 

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

  5. 如果以前的所有测试均通过,请再次使用LIKE进行测试。 甚至'Beyoncé' LIKE 'Beyonce'这样的'Beyoncé' LIKE 'Beyonce'应该可以工作。 有关更多信息,请使用Google MySQL排序规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM