如何解决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 中返回的结果:
可搜索的列:
解决方法
我遇到了同样的问题。我已经升级到 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 举报,一经查实,本站将立刻删除。