MySQL 쿼리 문자열 포함


307

$haystack특정 열의 값 (string )에 특정 데이터 (string $needle)가 다음과 같이 포함되어 있는지 확인하는 MySQL로 쿼리를 만드는 방법을 알아 내려고 노력 했습니다.

mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");

PHP에서 함수는이라고 불립니다 substr($haystack, $needle).

WHERE substr(`column`, '{$needle}')=1

답변:


437

실제로 매우 간단합니다.

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");

%설정 한 문자 (없음, 하나 또는 다수)을위한 와일드 카드입니다. 매우 큰 데이터 세트에서는 속도가 느려질 수 있으므로 데이터베이스가 커지면 전체 텍스트 인덱스를 사용해야합니다.


1
준비된 쿼리를 사용하는 경우에만 작동합니다. 실제 문자열을 사용하는 경우 (예 : liquibase sql upgrade 스크립트) 아래 언급 된 INSTR을 고려하십시오. 문자열에 %가 포함되어 있으면 일치하는 항목이 시작되기 때문입니다.
Ryan Shillington 17

2
나는 쿼리와 같은 것에 대해 알고 있지만, 오늘 나는 어떤 열에 문자열에 특정 값이 있는지 찾아보고 싶었다.
Sizzling Code

1
대소 문자를 구분합니까?
화난 키위

2
@angry_kiwi : column LIKE '...'대소 문자를 구분하지 않고 대소 문자를 구분 column LIKE BINARY '...'합니다
Wolph

2
나는 놀랐어요 LIKE이 연산자는 두 개의 와일드 카드 문자를 사용하기 때문에 어떤 문자열을 확인하기 위해 제안 : %_. 즉, 문자열 $ needle에이 특수 문자 중 하나가 포함되어 있으면 결과가 전혀 예상되지 않습니다. 이 답장은 (-1), INSTR 답장은 (+1)입니다.
Skrol29

144

사용하다:

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0

참고:


확실히 LIKE가 INSTR보다 빠릅니까?
chris

17
@oedo : 다릅니다. LIKE %...%인덱스가 있으면 인덱스를 사용하지 않으므로 동일해야합니다. LIKE ...%있는 경우 색인을 사용합니다. 성능이 중요한 문제인 경우 전체 텍스트 검색 (FTS)이 더 나은 방법입니다.
OMG Ponies

완전한. 내가 찾던 것.
arik

2
사실이 솔루션은 마음에 like연산자 가있는 하위 문자열의 존재에 따라 정렬 할 수있는 방법이 없기 때문에 좋아합니다 . 로 instr문구는 다음과 같이 주문할 수 있습니다select * from table order by instr(col1,"mystring")
Radacina

필드에서 _을 (를) 검색하고 싶었습니다. 감사합니다
안전한 Ahmed

53
WHERE `column` LIKE '%$needle%'

2
문자 _ (밑줄)을 검색 할 때 쿼리 LIKE '% _ %'이 (가) 작동하지 않습니다. 어떤 이유로 _ 없이도 모든 문자열을 반환합니다.
Wojtek

1
@Wojtek _은 단일 문자에 대한 와일드 카드이므로 문자 밑줄을 검색하려면 이스케이프 처리해야합니다. 밑줄이있는 MySQL LIKE 쿼리를 참조하십시오 .
jkmartindale

29

LOCATEMySQL에서 사용 하고 있습니다 :

LOCATE (substr, str), LOCATE (substr, str, pos)

이 함수는 멀티 바이트 안전하며 적어도 하나의 인수가 이진 문자열 인 경우에만 대소 문자를 구분합니다.

귀하의 경우 :

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");

11
'열'은 따옴표없이 열이어야합니다
Wojtek

10

@WoLpH의 답변 외에도.

LIKE키워드를 사용할 때 문자열이 일치하는 방향을 제한 할 수도 있습니다. 예를 들면 다음과 같습니다.

당신으로 시작하는 문자열을 찾고 있다면 $needle:

... WHERE column LIKE '{$needle}%'

다음으로 끝나는 문자열을 찾고 있다면 $needle:

... WHERE column LIKE '%{$needle}'

3

이것이 위험하다는 것을 명심하십시오 :

WHERE `column` LIKE '%{$needle}%'

먼저해라 :

$needle = mysql_real_escape_string($needle);

따라서 가능한 공격을 방지합니다.


7
* 일부 가능한 공격. 또한 mysql_real_escape_string향후 PHP 릴리스에서는 더 이상 사용되지 않을 예정입니다.
Jack Tuck

11
당신은 준비된 문장을 사용해야 하며, 이스케이프를 PHP로 남겨 두어야합니다. $stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
cloudworks

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.