【问题标题】:Search mySQL for special unicode characters with mysqli with PHP使用 mysqli 和 PHP 在 mySQL 中搜索特殊的 unicode 字符
【发布时间】: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


【解决方案1】:
json_encode($str, JSON_UNESCAPED_UNICODE)

添加该标志以便您获得字母,而不是 Unicode 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多