12.5.1 문자열 비교 함수
표 12.8 문자열 비교 연산자
이름 | 설명 |
---|---|
LIKE | 단순한 패턴 일치 |
NOT LIKE | 단순한 패턴 일치의 부정 |
STRCMP() | 2 개의 문자열을 비교합니다 |
문자열 함수에 인수로 이진 문자열이 지정되어있는 경우, 결과 문자열을 바이너리 문자열입니다. 문자열로 변환 된 숫자는 이진 문자열로 처리됩니다. 비교 만이 영향을받습니다.
일반적으로 문자열 비교 식으로 대소 문자를 구분하는 경우는 대소 문자를 구분하는 방법으로 비교가 실행됩니다.
expr
LIKEpat
[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_ESCAPES
SQL 모드가 활성화되어있는 경우 순서를 비워 둘 수 없습니다.다음 두 문장은 피연산자 중 하나가 이진 문자열 인 경우를 제외하고 문자열 비교는 대소 문자를 구분하지 않는 것을 보여줍니다.
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 | +--------------+-----------------------+expr
NOT LIKEpat
[ESCAPE 'escape_char
']이것은
NOT (
와 같습니다.expr
LIKEpat
[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
는 항상expr
NULL
을 반환하기 때문입니다.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 | +--------------------------------------------+