文字列関数がバイナリ ストリングを引数として与えられている場合、結果ストリングもバイナリ ストリングとなります。ストリングに変換された数字は、バイナリ ストリングとして扱われます。これは比較にのみ影響を及ぼします。
通常、文字列比較の式に大文字小文字の区別のあるものがある場合、その比較は大文字小文字の区別のある様式で行われます。
expr
LIKE
pat
[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 | +--------------------------------------+
LIKE
では、次のふたつのワイルドカード文字をパターンで使用することができます
:
文字 | 説明 |
% |
0 からあらゆる数の文字でもマッチする。 |
_ |
ひとつの文字を明確にマッチする。 |
mysql>SELECT 'David!' LIKE 'David_';
-> 1 mysql>SELECT 'David!' LIKE '%D%v%';
-> 1
ワイルドカード文字のリテラル
インスタンスをテストするには、エスケープ文字で優先させます。ESCAPE
文字を指定しない場合は、‘\
’
が仮定されます。
ストリング | 説明 |
\% |
‘% ’ 文字をひとつマッチする。 |
\_ |
‘_ ’ 文字をひとつマッチする。 |
mysql>SELECT 'David!' LIKE 'David\_';
-> 0 mysql>SELECT 'David_' LIKE 'David\_';
-> 1
異なるエスケープ文字を指定するには、ESCAPE
句を使用します :
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
-> 1
エスケープ シーケンスは空か、1
文字長である必要があります。MySQL 5.1.2
からは、NO_BACKSLASH_ESCAPES
SQL
モードを有効にすると、シーケンスを空にすることはできません。
次のふたつのステートメントは、オペランドのひとつがバイナリ ストリングでない限り、文字列比較は大文字小文字の区別をしないことを示しています :
mysql>SELECT 'abc' LIKE 'ABC';
-> 1 mysql>SELECT 'abc' LIKE BINARY 'ABC';
-> 0
MySQL では、LIKE
を数値式で使用することができます。(
標準の SQL LIKE
のエクステンションです ) 。
mysql> SELECT 10 LIKE '1%';
-> 1
注記 :MySQL は C
エスケープ構文をストリングで使用するため
( 例えば、‘\n
’
で改行文字を表現 ) 、LIKE
ストリングで使用する
‘\
’
はすべて二重にする必要があります。例えば、‘\n
’
を検索するには、‘\\n
’
と指定します。‘\
’
の検索には、‘\\\\
’
と指定します。これは、バックスラッシュがパーサによってストリップされ、そしてパターンのマッチが実行された時にもストリップされるため、ひとつのバックスラッシュを残してマッチさせるためです。(
例外 :パターン
ストリングの最後では、バックスラッシュは
‘\\
’
と指定できます。ストリングの末尾では、エスケープの後に連なるものがないため、バックスラッシュはそのもので独立することができます
) 。
expr
NOT LIKE
pat
[ESCAPE
'escape_char
']
これは、NOT (
と同様です。
expr
LIKE pat
[ESCAPE
'escape_char
'])
NULL
を含むカラムとの
NOT LIKE
比較を伴う Aggregate
クエリは、予想外の結果を生成します。例として、次の表とデータを参考にしてください
:
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 LIKE '%baz%';
は
2
を戻すと思われがちです。しかし、この場合は異なります
: 2 番目のクエリは 0
を戻します。これは、NULL NOT LIKE
が、expr
expr
の値に関わりなく、常に NULL
を戻すためです。NULL
を伴う
aggregate クエリと、NOT RLIKE
または NOT REGEXP
を使用する比較でも同様です。このような場合、次のように、OR
( AND
ではなく )
を使用して、NOT NULL
を明示的にテストする必要があります :
SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
,
expr
NOT REGEXP
pat
expr
NOT RLIKE
pat
これは、NOT (
と同様です。
expr
REGEXP pat
)
,
expr
REGEXP
pat
expr
RLIKE
pat
パターン pat
に対して、ストリングの式
expr
のパターン照合を行います。このパターンは拡張正規表現にもなりえます。正規表現の構文については、項11.3.2. 「正規表現」
で説明されています。expr
が pat
と一致する場合は
1
を戻し、それ以外では
0
を戻します。expr
もしくは pat
のどちらかが NULL
である場合、結果は NULL
になります。RLIKE
は、mSQL
との互換性のために用意された、REGEXP
のシノニムです。
パターンはリテラル ストリングである必要があります。例えば、文字列式、またはテーブル カラムとして指定するのでもかまいません。
注記 :MySQL は C
エスケープ構文をストリングで使用するため
( 例えば、‘\n
’
で改行文字を表現 ) 、REGEXP
ストリングで使用する
‘\
’
はすべて二重にする必要があります。
REGEXP
は、バイナリ
ストリングと使用する場合以外では、大文字小文字の区別をしません。
mysql>SELECT 'Monty!' REGEXP 'm%y%%';
-> 0 mysql>SELECT 'Monty!' REGEXP '.*';
-> 1 mysql>SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
-> 1 mysql>SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
-> 1 0 mysql>SELECT 'a' REGEXP '^[a-d]';
-> 1
REGEXP
および RLIKE
は、文字のタイプを決定する際に、現行の文字セットを使用します。デフォルトは
latin1
( cp1252 West European )
です。注意 :
これらの演算子はマルチバイトでは安全ではありません。
STRCMP()
は、ストリングが同じであれば
0
を戻し、現行のソート順において最初の引数が
2 番目のものより小さい場合は
-1
、そしてそれ以外では
1
を戻します。
mysql>SELECT STRCMP('text', 'text2');
-> -1 mysql>SELECT STRCMP('text2', 'text');
-> 1 mysql>SELECT STRCMP('text', 'text');
-> 0
STRCMP()
は、比較が行われる際、現行の文字セットを使用します。これによって、デフォルトの比較挙動では、ひとつか双方のオペランドがバイナリ
ストリングでない限り、大文字小文字の区別がなくなります。