文字列関数に引数としてバイナリ文字列が指定されている場合は、結果の文字列もバイナリ文字列になります。文字列に変換された数字は、バイナリ文字列として処理されます。比較のみがこの影響を受けます。
通常、文字列比較の式で大文字と小文字が区別される場合は、大文字と小文字が区別される方法で比較が実行されます。
-
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
では、パターンで次の 2 つのワイルドカード文字を使用できます。文字 説明 %
0 個の文字も含めて、任意の数の文字に一致します _
正確に 1 つの文字に一致します 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 文字の長さにするようにしてください。実行時に、式は定数として評価される必要があります。
NO_BACKSLASH_ESCAPES
SQL モードが有効になっている場合は、シーケンスを空にできません。次の 2 つのステートメントは、オペランドのいずれかがバイナリ文字列である場合を除いて、文字列の比較では大文字と小文字が区別されないことを示しています。
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 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
を返すと想定しています。ただし、事実は異なります。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()
は、文字列が同じ場合は0
を返し、現在のソート順に従って 1 番目の引数が 2 番目よりも小さい場合は-1
、それ以外の場合は1
を返します。mysql> SELECT STRCMP('text', 'text2'); -> -1 mysql> SELECT STRCMP('text2', 'text'); -> 1 mysql> SELECT STRCMP('text', 'text'); -> 0
STRCMP()
は、引数の照合順序を使用して比較を実行します。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 | +--------------------------------------------+