【发布时间】:2019-08-25 23:03:01
【问题描述】:
我有一个搜索自动完成功能,当有人键入法语字符时会中断,例如 É
É 像 '\u00c9' - 一个 unicode 代码点 - 在 mySQL 表中存储:
'id', 'term', 'count', 'words', 'locale'
'5218', '\u00c9COLORADO', '4', '1', 'fr-ca'
'5590', '\u00c9MADEUP', '1', '1', 'fr-ca'
'5511', 'EXCITE', '1', '1', 'fr-ca'
在 PHP 中,É 是 '\xc3\x89'。我编写了下面的代码以将其转换为查询的 unicode,以便匹配。在我的系统上,json_encode() 输出了 "\\u00c9" 所以我不得不 str_replace() 一些额外的字符
$andrew = json_encode($criteria);
$temp2 = str_replace('"', "", $temp1);
$temp3 = str_replace('\\\\', '\\', $temp2);
$data = self::all( array( 'locale' => $locale , 'term' => array('$like' => $temp3."%" ) ), array('count'=>0,'term'=>2),0,12 );
当我在搜索中输入 É 并在 SQL 查询中输入 error_log() 时,它是:
SELECT * FROM search_term WHERE `locale` = 'fr-ca' AND `term` LIKE '\\\\u00c9%' ORDER BY `count` DESC, `term` ASC,
当我在 mySQL Workbench 中运行该 SQL 查询时,它可以工作(在 LIKE 的情况下需要四个反斜杠),结果集是:
'id', 'term', 'count', 'words', 'locale'
'5218', '\u00c9COLORADO', '4', '1', 'fr-ca'
'5590', '\u00c9MADEUP', '1', '1', 'fr-ca'
但是当我使用 mysqli 在 PHP 中运行该查询时:
$res = mysqli_query($conn, $query);
它不返回任何结果/匹配项。
mysqli_query() 如何或为什么会更改查询以使其失败?我该如何编写,以便当搜索字符为 É 时,它与该字符匹配 - 它是如何存储在数据库中的?
【问题讨论】:
-
不要忽略你的primary issue,你的代码中有一个偷偷摸摸的错误,将
\u00c9变成\\u00c9,你应该考虑解决它而不是用str_replace破解它,好运气!。关于这个问题中的问题,您的 SQL 在 PHP 中失败可能是因为您在双引号字符串""中使用了反斜杠,这触发了 PHP 字符串插值过程,所以这个字符串"\\"只有 1 个反斜杠,而这个字符串\\\\u00c9%有 2 个反斜杠。
标签: php mysql character-encoding