微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PDO 无法使用 COLLATE utf8mb4_unicode_ci

如何解决PDO 无法使用 COLLATE utf8mb4_unicode_ci

我对 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 中返回的结果:

Results returned in phpmyadmin

搜索的列:

The searchable columns

解决方法

我遇到了同样的问题。我已经升级到 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();
    }
?>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。