文字列関数がバイナリ ストリングを引数として与えられている場合、結果ストリングもバイナリ ストリングとなります。ストリングに変換された数字は、バイナリ ストリングとして扱われます。これは比較にのみ影響を及ぼします。
通常、文字列比較の式に大文字小文字の区別のあるものがある場合、その比較は大文字小文字の区別のある様式で行われます。
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
が、exprexpr
の値に関わりなく、常に 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
patexpr NOT RLIKE
pat
これは、NOT (
と同様です。
expr
REGEXP pat)
,
expr REGEXP
patexpr 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()
は、比較が行われる際、現行の文字セットを使用します。これによって、デフォルトの比較挙動では、ひとつか双方のオペランドがバイナリ
ストリングでない限り、大文字小文字の区別がなくなります。
