>데이터 베이스 >MySQL 튜토리얼 >LIKE 절에서 MySQL 와일드카드를 올바르게 이스케이프하는 방법은 무엇입니까?

LIKE 절에서 MySQL 와일드카드를 올바르게 이스케이프하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-02 03:54:09306검색

How to Properly Escape MySQL Wildcards in LIKE Clauses?

MySQL 와일드카드 이스케이프

문제

Prepared 문을 사용할 수 없는 레거시 서버에서는 사용자 입력을 MySQL로 보내기 전에 이스케이프하는 것이 필수적입니다. 그러나 mysql_real_escape_string만 사용하면 MySQL 와일드카드(_ 및 %)를 이스케이프할 수 없으며 특정 패턴은 예상치 못한 결과를 반환합니다.

예를 들어 "test_test' 입력이 전송되면 데이터베이스에 "test_test '"가 표시됩니다. 밑줄에는 백슬래시 접두사가 있고 작은따옴표와 큰따옴표에는 그렇지 않습니까?

대답

_ 및 %는 MySQL에서 와일드카드가 아니며 문자열 리터럴에 삽입할 때 이스케이프해서는 안 됩니다.

그러나 , _ 및 %는 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으로 문의하세요.