【问题标题】:PDO fails to return MySQL search using COLLATE utf8mb4_unicode_ciPDO 无法使用 COLLATE utf8mb4_unicode_ci 返回 MySQL 搜索
【发布时间】:2021-10-02 19:44:07
【问题描述】:

我在 MySQL 表上有一个简单的 PHP PDO 查询,它在 phpMyAdmin 控制台中返回一个结果,但无法使用下面的查询返回 PHP 中的任何行... 为什么 phpMyAdmin 和 PDO 查询会/可能会有不同的结果?

$statement = $this->db->connection->prepare($sql);
$statement->execute();
$arrResults = $statement->fetchAll(PDO::FETCH_ASSOC);

在我的 dsn 中有

;charset=utf8mb4

还有设置

$this->connection->exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;");

查询的 WHERE 部分如下...注意导致 PDO 问题的“ø”字符。如果我删除它,搜索工作正常。

WHERE (R.last_name LIKE '%Schø%' OR R.first_name LIKE '%Schø%')

WHERE (R.last_name LIKE _utf8mb4 '%Schø%' COLLATE utf8mb4_unicode_ci OR R.first_name LIKE _utf8mb4 '%Schø%' COLLATE utf8mb4_unicode_ci )

phpmyadmin 中返回的结果:

可搜索的列:

【问题讨论】:

    标签: php mysql pdo utf8mb4 collate


    【解决方案1】:

    我遇到了同样的问题。我已经升级到 PHP 8.0.9 和 MySQL 8.0.26 并且问题已经消失了。我发现这个问题在某种程度上与 PDO 的 bindParam 调用有关,因为它以某种不正确/不兼容的方式引用了 UTF-8。

    我根本没有使用 SET NAME utf8mb4 调用,而是在 PDO 的 DSN 上指定了 utf8mb4

    在 MySQL 方面,我将架构/数据库、其表和列设置为 utf8mb4_unicode_520_ci(这是最新标准,utf8mb4_unicode_ci 应该也可以使用)。

    分享对我有用的代码,这样您就可以了解实际工作的内容。

    <?php
        $text = 'verbündet';
        try
        {
            $database = 'german';
            $username = 'german';
            $password = 'blaB1A81a';
            $dbh = new PDO("mysql:host=localhost;dbname=".$database.";charset=utf8mb4", $username, $password);
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
        try
        {
            $text = strtolower($text);
            $data = [];
            $s = $dbh->prepare("SELECT `word` FROM `words_de` WHERE `word` = :word");
            $s->bindParam(':word', $text, PDO::PARAM_STR);
            $s->execute();
            $fetch = $s->fetch(PDO::FETCH_ASSOC);
            if($fetch === false)
            {
                $data = null;
            }
            else
            {
                $data = $fetch['word'];
            }
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2016-10-16
      • 2012-11-20
      相关资源
      最近更新 更多