PHP PDO用MATCH AGAINST查含变音字符无结果,mysqli正常
问题原因与解决方案
这个问题的核心是PDO的字符集设置方式错误,导致查询时的字符串编码和数据库不匹配,而mysqli的设置是正确的,所以能正常返回结果。
为什么PDO不行?
你之前写的$dboptions = array('charset=utf8mb4');是无效的——PDO的选项数组需要使用官方定义的常量(比如PDO::ATTR_ERRMODE)作为键,直接写'charset=utf8mb4'不会被PDO识别,等于根本没设置连接字符集。这就导致带变音字符的查询字符串(比如Müller)被以默认编码(可能是latin1)发送给数据库,和你数据库的utf8mb4编码不匹配,自然匹配不到FULLTEXT索引里的内容。
而mysqli调用了$conn->set_charset("utf8mb4"),这个方法会直接设置连接的字符集,确保查询字符串的编码和数据库一致,所以能正常查到结果。
正确的PDO字符集设置方法
有两种可靠的方式来设置PDO的utf8mb4字符集:
方法1:在DSN中直接指定(推荐)
把charset参数直接写在PDO的DSN字符串里:
$pdo = new PDO("mysql:host=$dbservername;dbname=$dbname;charset=utf8mb4", $dbusername, $dbpassword); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
方法2:用初始化命令设置(兼容旧版本PDO)
如果你的PHP版本较旧,DSN里的charset参数不生效,可以用PDO::MYSQL_ATTR_INIT_COMMAND执行SET NAMES utf8mb4:
$dboptions = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4' ); $pdo = new PDO("mysql:host=$dbservername;dbname=$dbname", $dbusername, $dbpassword, $dboptions);
验证修改
按照上面的方式修改PDO连接代码后,再执行你的MATCH AGAINST查询,应该就能和mysqli、phpMyAdmin一样返回正确的结果了。
内容的提问来源于stack exchange,提问作者mars
相关产品推荐
相关产品推荐

