首页 >数据库 >mysql教程 >如何在 LIKE 子句中正确转义 MySQL 通配符?

如何在 LIKE 子句中正确转义 MySQL 通配符?

Barbara Streisand
Barbara Streisand原创
2024-12-02 03:54:09309浏览

How to Properly Escape MySQL Wildcards in LIKE Clauses?

转义 MySQL 通配符

问题

在准备好的语句不可用的旧服务器上,在将用户输入发送到 MySQL 之前转义用户输入至关重要。然而,单独使用 mysql_real_escape_string 并不能转义 MySQL 通配符(_ 和 %),并且某些模式会返回意外结果。

例如,当发送输入“test_test '时,数据库显示“test_test '。”下划线是否有反斜杠前缀,而单引号和双引号不?

答案

_ 和 % 在 MySQL 中不是通配符,在插入字符串文字时不应转义 mysql_real_escape_string 足以达到此目的。

但是、 _ 和 % 在 LIKE 匹配表达式中使用时确实需要特殊处理,以确保它们仅匹配其文字值,而不是模式。这涉及两个方面。转义级别:

LIKE 转义:

  • 转义下划线、百分号以及 LIKE 表达式中使用的任何转义字符。
  • 这必须即使使用参数化,也可以在 SQL 内部完成

字符串文字转义:

  • 转义字符串中使用的字符,包括 LIKE 转义字符。
  • 这个在 SQL 之外完成,例如,使用mysql_real_escape_string.

示例

对于 MySQL,如果你想匹配文字百分号,你可以使用双反斜杠转义,例如,LIKE 'something\%`。

为了避免这种混乱并确保可移植性,您可以使用 LIKE ... 覆盖默认转义字符ESCAPE ... 构造。

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

或在 PDO 中使用参数:

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

以上是如何在 LIKE 子句中正确转义 MySQL 通配符?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn