MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  文字列比較関数および演算子

12.8.1 文字列比較関数および演算子

表 12.13 「文字列比較関数および演算子」

名前 説明
LIKE 単純なパターン一致
NOT LIKE 単純なパターン一致の否定
STRCMP() 2 つの文字列を比較します

文字列関数に引数としてバイナリ文字列が指定されている場合は、結果の文字列もバイナリ文字列になります。 文字列に変換された数字は、バイナリ文字列として処理されます。 比較のみがこの影響を受けます。

通常、文字列比較のいずれかの式で大/小文字が区別される場合、比較は大/小文字を区別して実行されます。

  • expr LIKE pat [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 |
    +--------------------------------------+

    特に、末尾のスペースは常に意味を持ちます。 これは、非バイナリ文字列 (CHARVARCHAR および 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 LIKE pat [ESCAPE 'escape_char']

    これは、NOT (expr LIKE pat [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 |
    +---------------------------------------------+

関連キーワード:  関数, utf, 比較, COLLATE, STRCMP, 文字, 空間, NOT, filename, 照合