文字列関数に引数としてバイナリ文字列が指定されている場合は、結果の文字列もバイナリ文字列になります。 文字列に変換された数字は、バイナリ文字列として処理されます。 比較のみがこの影響を受けます。
通常、文字列比較のいずれかの式で大/小文字が区別される場合、比較は大/小文字を区別して実行されます。
-
expr
LIKEpat
[ESCAPE 'escape_char
']SQL パターンを使用したパターン一致。
1
(TRUE
) または0
(FALSE
) を返します。expr
またはpat
のいずれかがNULL
である場合は、結果もNULL
になります。パターンはリテラル文字列である必要はありません。 たとえば、文字列式やテーブルカラムとして指定できます。 後者の場合、カラムは MySQL 文字列型のいずれかとして定義する必要があります (セクション11.3「文字列データ型」 を参照)。
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
およびTEXT
値) の末尾のスペースの意味が比較に使用される照合のパッド属性に依存する=
演算子で実行される比較とは異なります。 詳細は、比較での後続領域の処理を参照してください。LIKE
では、パターンに次の 2 つのワイルドカード文字を使用できます:%
は、ゼロ文字を含め、任意の数の文字に一致します。_
は、単一の文字と完全に一致します。
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 文字の長さにするようにしてください。 実行時に、式は定数として評価される必要があります。
NO_BACKSLASH_ESCAPES
SQL モードが有効になっている場合は、シーケンスを空にできません。次の 2 つのステートメントは、オペランドのいずれかが大文字と小文字を区別しないかぎり、文字列の比較で大文字と小文字が区別されないことを示しています (大文字と小文字が区別される照合順序を使用するか、バイナリ文字列です):
mysql> SELECT 'abc' LIKE 'ABC'; -> 1 mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_0900_as_cs; -> 0 mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_bin; -> 0 mysql> SELECT 'abc' LIKE BINARY 'ABC'; -> 0
標準 SQL の拡張機能として、MySQL では数値式に対する
LIKE
が許可されます。mysql> SELECT 10 LIKE '1%'; -> 1
注記MySQL では文字列で C エスケープ構文 (改行文字を表す
\n
など) が使用されるため、LIKE
文字列で使用する\
をダブルクリックする必要があります。 たとえば、\n
を検索するには、\\n
と指定します。\
を検索するには、\\\\
として指定します。これは、バックスラッシュがパーサーによって一度だけ取り除かれ、パターン一致が行われたときに再度取り除かれ、単一のバックスラッシュが照合対象のままになるためです。例外: パターン文字列の末尾では、バックスラッシュを
\\
と指定できます。 文字列の末尾では、エスケープの後ろに何もないため、バックスラッシュはそれ自体を表します。 テーブルに次の値が含まれると仮定します。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(
expr1
,expr2
)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 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs; mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs; mysql> SELECT STRCMP(@s1, @s2), STRCMP(@s3, @s4); +------------------+------------------+ | STRCMP(@s1, @s2) | STRCMP(@s3, @s4) | +------------------+------------------+ | 0 | -1 | +------------------+------------------+
照合順序の互換性がない場合は、その他との互換性を保つために、引数のいずれかを変換する必要があります。 セクション10.8.4「式での照合の強制性」を参照してください。
mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs; mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs; --> mysql> SELECT STRCMP(@s1, @s3); ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_0900_as_cs,IMPLICIT) for operation 'strcmp' mysql> SELECT STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci); +---------------------------------------------+ | STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci) | +---------------------------------------------+ | 0 | +---------------------------------------------+