Loading...
MySQL 9.5 Reference Manual 9.5의 14.8.1 String Comparison Functions and Operators의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Table 14.13 String Comparison Functions and Operators
| Name | Description |
|---|---|
LIKE | 단순 패턴 매칭 |
NOT LIKE | 단순 패턴 매칭의 부정 |
STRCMP() | 두 문자열 비교 |
문자열 함수에 바이너리 문자열을 인수로 전달하면, 결과 문자열도 바이너리 문자열이 됩니다. 숫자가 문자열로 변환되면 바이너리 문자열로 취급됩니다. 이는 비교에만 영향을 줍니다.
일반적으로, 문자열 비교에 포함된 식 중 하나라도 대소문자 구분이면 비교는 대소문자 구분 방식으로 수행됩니다.
문자열 함수가
mysql 클라이언트 내부에서 호출되는 경우, 바이너리 문자열은
--binary-as-hex 값에 따라 16진 표기법으로 표시됩니다.
해당 옵션에 대한 자세한 내용은
Section 6.5.1, “mysql — The MySQL Command-Line Client”을 참조하십시오.
SQL 패턴을 사용한 패턴 매칭입니다.
1 (TRUE) 또는
0 (FALSE)를 반환합니다.
expr 또는
pat 중 하나가 NULL이면
결과는 NULL입니다.
패턴은 리터럴 문자열일 필요가 없습니다. 예를 들어, 문자열 식이나 테이블 컬럼으로 지정할 수 있습니다. 후자의 경우, 컬럼은 MySQL 문자열 타입 중 하나로 정의되어야 합니다( Section 13.3, “String Data Types” 참조).
SQL 표준에 따르면, LIKE는
문자 단위로 매칭을 수행하므로,
= 비교
연산자와는 다른 결과를 생성할 수 있습니다:
1mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci; 2+-----------------------------------------+ 3| 'ä' LIKE 'ae' COLLATE latin1_german2_ci | 4+-----------------------------------------+ 5| 0 | 6+-----------------------------------------+ 7mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci; 8+--------------------------------------+ 9| 'ä' = 'ae' COLLATE latin1_german2_ci | 10+--------------------------------------+ 11| 1 | 12+--------------------------------------+
특히, 뒤따르는 공백(trailing spaces)은 항상 중요합니다.
이는 = 연산자를 사용하여 수행되는 비교와는 다릅니다.
논바이너리 문자열(CHAR,
VARCHAR, TEXT
값)에 대해 비교에 사용되는 콜레이션의 패딩 속성에 따라
뒤따르는 공백의 중요성이 달라집니다. 자세한 내용은
Trailing Space Handling in Comparisons를 참조하십시오.
LIKE에서는 패턴에서 다음 두 개의 와일드카드 문자를
사용할 수 있습니다:
%는 0개 이상의 임의의 문자를
매칭합니다.
_는 정확히 한 개의 문자를
매칭합니다.
1mysql> SELECT 'David!' LIKE 'David_'; 2 -> 1 3mysql> SELECT 'David!' LIKE '%D%v%'; 4 -> 1
와일드카드 문자의 리터럴 인스턴스를 검사하려면,
해당 문자 앞에 이스케이프 문자를 붙입니다. ESCAPE
문자를 지정하지 않으면,
NO_BACKSLASH_ESCAPES SQL
모드가 활성화되지 않은 한 \가
사용된 것으로 간주됩니다. 이 모드가 활성화된 경우에는
이스케이프 문자가 사용되지 않습니다.
\%는 하나의 %
문자를 매칭합니다.
\_는 하나의 _
문자를 매칭합니다.
1mysql> SELECT 'David!' LIKE 'David\_'; 2 -> 0 3mysql> SELECT 'David_' LIKE 'David\_'; 4 -> 1
다른 이스케이프 문자를 지정하려면
ESCAPE 절을 사용합니다:
1mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; 2 -> 1
이스케이프 시퀀스는 이스케이프 문자를 지정하려면 한 글자 길이여야 하며,
이스케이프 문자를 사용하지 않음을 지정하려면 비어 있어야 합니다.
식은 실행 시간에 상수로 평가되어야 합니다.
NO_BACKSLASH_ESCAPES SQL
모드가 활성화된 경우, 이 시퀀스는 비어 있을 수 없습니다.
다음 문장들은 문자열 비교가 피연산자 중 하나가 대소문자 구분(대소문자 구분 콜레이션 사용 또는 바이너리 문자열)인 경우를 제외하고는 대소문자 구분이 아님을 보여줍니다:
1mysql> SELECT 'abc' LIKE 'ABC'; 2 -> 1 3mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_0900_as_cs; 4 -> 0 5mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_bin; 6 -> 0 7mysql> SELECT 'abc' LIKE BINARY 'ABC'; 8 -> 0
표준 SQL에 대한 확장으로, MySQL은
숫자 식에 대해서도
LIKE를 허용합니다.
1mysql> SELECT 10 LIKE '1%'; 2 -> 1
이러한 경우 MySQL은 식을 문자열로 암시적 변환하려고 시도합니다. Section 14.3, “Type Conversion in Expression Evaluation”을 참조하십시오.
참고
MySQL은 문자열에서 C 이스케이프 구문을 사용합니다(예: 개행 문자를
표현하기 위해 \n 사용).
LIKE 문자열에 리터럴 \를 포함시키려면
이를 두 번 작성해야 합니다.
(NO_BACKSLASH_ESCAPES SQL
모드가 활성화된 경우는 예외이며, 이 경우 이스케이프 문자가
사용되지 않습니다.) 예를 들어, \n을 검색하려면
이를 \\n으로 지정해야 합니다. \를 검색하려면
이를 \\\\로 지정해야 합니다. 이는 백슬래시가
파서에 의해 한 번, 패턴 매치가 수행될 때 또 한 번
제거되어, 최종적으로 매칭에 사용될 단일 백슬래시만
남기 때문입니다.
예외: 패턴 문자열의 끝에서는 백슬래시를
\\로 지정할 수 있습니다. 문자열의 끝에서는
백슬래시 뒤에 이스케이프할 문자가 없으므로
그 자체를 의미합니다. 예를 들어, 테이블에 다음 값이
포함되어 있다고 가정해 봅시다:
1mysql> SELECT filename FROM t1; 2+--------------+ 3| filename | 4+--------------+ 5| C: | 6| C:\ | 7| C:\Programs | 8| C:\Programs\ | 9+--------------+
백슬래시로 끝나는 값을 검사하려면 다음 패턴 중 하나를 사용하여 값을 매칭할 수 있습니다:
1mysql> SELECT filename, filename LIKE '%\\' FROM t1; 2+--------------+---------------------+ 3| filename | filename LIKE '%\\' | 4+--------------+---------------------+ 5| C: | 0 | 6| C:\ | 1 | 7| C:\Programs | 0 | 8| C:\Programs\ | 1 | 9+--------------+---------------------+ 10 11mysql> SELECT filename, filename LIKE '%\\\\' FROM t1; 12+--------------+-----------------------+ 13| filename | filename LIKE '%\\\\' | 14+--------------+-----------------------+ 15| C: | 0 | 16| C:\ | 1 | 17| C:\Programs | 0 | 18| C:\Programs\ | 1 | 19+--------------+-----------------------+
이는 NOT (expr LIKE pat [ESCAPE 'escape_char'])와
동일합니다.
참고
NULL을 포함하는 컬럼에 대한
NOT LIKE 비교가 포함된 집계 쿼리는 예기치 않은 결과를
산출할 수 있습니다. 예를 들어, 다음 테이블과 데이터를
고려해 보십시오:
1CREATE TABLE foo (bar VARCHAR(10)); 2 3INSERT 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을 반환합니다. 이는
NULL NOT LIKE expr가
_expr_의 값과 관계없이
항상 NULL을 반환하기 때문입니다.
NULL과
NOT RLIKE 또는 NOT REGEXP를 사용하는 비교가 포함된 집계 쿼리에서도 마찬가지입니다.
이러한 경우에는 다음과 같이
AND가 아니라
OR를 사용하여
NOT NULL을 명시적으로 검사해야 합니다:
1SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
STRCMP()는
두 문자열이 동일하면
0을 반환하고,
현재 정렬 순서에 따라 첫 번째 인수가 두 번째 인수보다
작으면 -1을, 어느 한 인수가
NULL이면 NULL을
반환합니다. 그 밖의 경우에는 1을
반환합니다.
1mysql> SELECT STRCMP('text', 'text2'); 2 -> -1 3mysql> SELECT STRCMP('text2', 'text'); 4 -> 1 5mysql> SELECT STRCMP('text', 'text'); 6 -> 0
STRCMP()는
인수의 콜레이션을 사용하여 비교를 수행합니다.
1mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci; 2mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci; 3mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs; 4mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs; 5mysql> SELECT STRCMP(@s1, @s2), STRCMP(@s3, @s4); 6+------------------+------------------+ 7| STRCMP(@s1, @s2) | STRCMP(@s3, @s4) | 8+------------------+------------------+ 9| 0 | -1 | 10+------------------+------------------+
콜레이션이 호환되지 않는 경우, 인수 중 하나를 다른 인수와 호환되도록 변환해야 합니다. Section 12.8.4, “Collation Coercibility in Expressions”를 참조하십시오.
1mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci; 2mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci; 3mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs; 4mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs; 5 --> 6mysql> SELECT STRCMP(@s1, @s3); 7ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) 8and (utf8mb4_0900_as_cs,IMPLICIT) for operation 'strcmp' 9mysql> SELECT STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci); 10+---------------------------------------------+ 11| STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci) | 12+---------------------------------------------+ 13| 0 | 14+---------------------------------------------+
14.8 String Functions and Operators
14.8.2 Regular Expressions