文字列関数がバイナリ列を引数として与えられている場合、結果文字列もバイナリ列となります。文字列に変換された数字は、バイナリ列として扱われます。これは比較にのみ影響を及ぼします。
通常、文字列比較の式に大文字小文字の区別のあるものがある場合、その比較は大文字小文字の区別のある様式で行われます。
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 | +--------------------------------------+
特に、=
演算子を使って
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 つの 「% 」
キャラクタにマッチします |
\_ |
1 つの 「_ 」
キャラクタにマッチします |
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
」
を指定します。「\
」
の検索には、「\\\\
」
を指定します。これは、バックスラッシュがパーサーによってストリップされ、そしてパターンのマッチが実行されたときにもストリップされるため、1
つのバックスラッシュを残してマッチさせるためです。
例外:
パターン文字列の最後では、バックスラッシュは
「\\
」
と指定できます。文字列の末尾では、エスケープの後に連なるものがないため、バックスラッシュはそのもので独立することができます。テーブルに次の値が含まれているものとします。
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 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;
STRCMP()
は、文字列が同じであれば
0
を返し、現行のソート順において最初の引数が
2 番目のものより小さい場合は
-1
、そしてそれ以外では
1
を返します。
mysql>SELECT STRCMP('text', 'text2');
-> -1 mysql>SELECT STRCMP('text2', 'text');
-> 1 mysql>SELECT STRCMP('text', 'text');
-> 0
STRCMP()
は、比較が行われる際、現行のキャラクタセットを使用します。これによって、デフォルトの比較挙動では、ひとつか双方のオペランドがバイナリ列でないかぎり、大文字小文字の区別がなくなります。