12.5.1 문자열 비교 함수
표 12.8 문자열 비교 연산자
| 이름 | 설명 |
|---|---|
LIKE | 단순한 패턴 일치 |
NOT LIKE | 단순한 패턴 일치의 부정 |
STRCMP() | 2 개의 문자열을 비교합니다 |
문자열 함수에 인수로 이진 문자열이 지정되어있는 경우, 결과 문자열을 바이너리 문자열입니다. 문자열로 변환 된 숫자는 이진 문자열로 처리됩니다. 비교 만이 영향을받습니다.
일반적으로 문자열 비교 식으로 대소 문자를 구분하는 경우는 대소 문자를 구분하는 방법으로 비교가 실행됩니다.
exprLIKEpat[ESCAPE 'escape_char']SQL의 단순한 정규 표현 비교를 사용한 패턴 매칭.
1(TRUE) 또는0(FALSE)을 리턴합니다.expr또는pat중 하나가NULL이면 결과도NULL입니다.패턴은 리터럴 문자열 일 필요는 없습니다. 예를 들어, 문자열 식이나 테이블 컬럼으로 지정할 수 있습니다.
SQL 표준에서는
LIKE는 문자마다 일치를 실행하기 위해=비교 연산자와는 다른 결과가 생성 될 수 있습니다.mysql>
SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;+-----------------------------------------+ | 'ä' LIKE 'ae' COLLATE latin1_german2_ci | +-----------------------------------------+ | 0 | +-----------------------------------------+ mysql>SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;+--------------------------------------+ | 'ä' = 'ae' COLLATE latin1_german2_ci | +--------------------------------------+ | 1 | +--------------------------------------+특히 후행 공백은 중요합니다. 그러나
=연산자를 사용하여 실행되는CHAR과VARCHAR비교에는 적용되지 않습니다.mysql>
SELECT 'a' = 'a ', 'a' LIKE 'a ';+------------+---------------+ | 'a' = 'a ' | 'a' LIKE 'a ' | +------------+---------------+ | 1 | 0 | +------------+---------------+ 1 row in set (0.00 sec)LIKE는 패턴에서 두 개의 와일드 카드 문자를 사용할 수 있습니다.문자 설명 %0 개의 문자도 포함 해, 임의의 수의 문자와 일치합니다 _정확히 하나의 문자와 일치합니다 mysql>
SELECT 'David!' LIKE 'David_';-> 1 mysql>SELECT 'David!' LIKE '%D%v%';-> 1와일드 카드 문자의 리터럴 인스턴스를 테스트하려면 그 전에 이스케이프 문자를 지정합니다.
ESCAPE문자를 지정하지 않으면 "\"가정됩니다.문자열 설명 \%하나의 ' %'문자와 일치합니다\_1 개의 " _"문자와 일치합니다mysql>
SELECT 'David!' LIKE 'David\_';-> 0 mysql>SELECT 'David_' LIKE 'David\_';-> 1다른 이스케이프 문자를 지정하려면
ESCAPE절을 사용합니다.mysql>
SELECT 'David_' LIKE 'David|_' ESCAPE '|';-> 1이스케이프 시퀀스가 비어하거나 문자의 길이하게하십시오. 실행시에 식은 상수로 평가 될 필요가 있습니다.
NO_BACKSLASH_ESCAPESSQL 모드가 활성화되어있는 경우 순서를 비워 둘 수 없습니다.다음 두 문장은 피연산자 중 하나가 이진 문자열 인 경우를 제외하고 문자열 비교는 대소 문자를 구분하지 않는 것을 보여줍니다.
mysql>
SELECT 'abc' LIKE 'ABC';-> 1 mysql>SELECT 'abc' LIKE BINARY 'ABC';-> 0MySQL은 숫자 식으로
LIKE이 허용됩니다. (이것은 표준 SQL의LIKE의 확장입니다.)mysql>
SELECT 10 LIKE '1%';-> 1참고MySQL에서 문자열 C의 이스케이프 구문 (예를 들어, 개행 문자를 나타 내기 위해 "
\n")를 사용하고 있기 때문에,LIKE문자열에서 사용되는 "\"모두 이중으로 지정해야합니다 . 예를 들어, "\n"를 검색하려면"\\n"로 지정합니다. "\"를 검색하려면"\\\\"로 지정합니다. 이것은 backslash는 파서에 의해 한 번 삭제 된 패턴 일치가 실행되는 경우에도 다시 제거되는 결과 일치되는 백 슬래시는 하나 밖에 남지 않기 때문입니다.예외 : 패턴 문자열의 끝에서 백 슬래시 "
\\"라고 지정할 수 있습니다. 문자열의 끝에서 탈출 뒤에 아무것도 없기 때문에 백 슬래시 자체를 나타냅니다. 테이블에 다음 값이 포함된다고 가정합니다.mysql>
SELECT filename FROM t1;+--------------+ | filename | +--------------+ | C: | | C:\ | | C:\Programs | | C:\Programs\ | +--------------+백 슬래시로 끝나는 값을 테스트하려면 다음 패턴 중 하나를 사용하여 값을 매칭 할 수 있습니다.
mysql>
SELECT filename, filename LIKE '%\\' FROM t1;+--------------+---------------------+ | filename | filename LIKE '%\\' | +--------------+---------------------+ | C: | 0 | | C:\ | 1 | | C:\Programs | 0 | | C:\Programs\ | 1 | +--------------+---------------------+ mysql>SELECT filename, filename LIKE '%\\\\' FROM t1;+--------------+-----------------------+ | filename | filename LIKE '%\\\\' | +--------------+-----------------------+ | C: | 0 | | C:\ | 1 | | C:\Programs | 0 | | C:\Programs\ | 1 | +--------------+-----------------------+exprNOT LIKEpat[ESCAPE 'escape_char']이것은
NOT (와 같습니다.exprLIKEpat[ESCAPE 'escape_char'])참고NULL을 포함 컬럼의NOT LIKE비교를 수반 집계 쿼리는 의외의 결과가 생성 될 수 있습니다. 예를 들어, 다음 테이블과 데이터를 검토하십시오.CREATE TABLE foo (bar VARCHAR (10)); INSERT INTO foo VALUES (NULL) (NULL);
쿼리
SELECT COUNT(*) FROM foo WHERE bar LIKE '%baz%';는0을 반환합니다.SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%';는2를 반환한다고 가정합니다. 그러나 사실은 다릅니다. 두 번째 쿼리는0을 반환합니다. 이것은expr의 값에 관계없이NULL NOT LIKE는 항상exprNULL을 반환하기 때문입니다.NULL을 수반 집계 쿼리 및NOT RLIKE또는NOT REGEXP을 사용하는 비교에서도 마찬가지입니다. 이러한 경우에는 다음과 같이 (AND대신)OR를 사용하여NOT NULL을 명시 적으로 테스트해야합니다.SELECT COUNT (*) FROM foo WHERE bar NOT LIKE '% baz %'OR bar IS NULL;STRCMP(expr1,expr2)STRCMP()은 문자열이 같으면0을 돌려 주어, 현재의 정렬 순서에 따라 첫 번째 인수가 두 번째보다 작은 경우는-1, 그렇지 않으면1을 반환합니다.mysql>
SELECT STRCMP('text', 'text2');-> -1 mysql>SELECT STRCMP('text2', 'text');-> 1 mysql>SELECT STRCMP('text', 'text');-> 0STRCMP()는 인수의 데이터 정렬을 사용하여 비교를 수행합니다.mysql>
SET @s1 = _latin1 'x' COLLATE latin1_general_ci;mysql>SET @s2 = _latin1 'X' COLLATE latin1_general_ci;mysql>SET @s3 = _latin1 'x' COLLATE latin1_general_cs;mysql>SET @s4 = _latin1 'X' COLLATE latin1_general_cs;mysql>SELECT STRCMP(@s1, @s2), STRCMP(@s3, @s4);+------------------+------------------+ | STRCMP(@s1, @s2) | STRCMP(@s3, @s4) | +------------------+------------------+ | 0 | 1 | +------------------+------------------+데이터 정렬 호환성이없는 경우에는 기타와의 호환성을 유지하기 위해 인수 중 하나를 변환해야합니다. 섹션 10.1.7.5 "식의 데이터 정렬" 을 참조하십시오.
mysql>
SELECT STRCMP(@s1, @s3);ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_general_cs,IMPLICIT) for operation 'strcmp' mysql>SELECT STRCMP(@s1, @s3 COLLATE latin1_general_ci);+--------------------------------------------+ | STRCMP(@s1, @s3 COLLATE latin1_general_ci) | +--------------------------------------------+ | 0 | +--------------------------------------------+