Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


12.5.1 文字列比較関数

表 12.8 文字列比較演算子

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

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

通常、文字列比較の式で大文字と小文字が区別される場合は、大文字と小文字が区別される方法で比較が実行されます。

  • 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 |
    +--------------------------------------+

    特に、末尾の空白は重要です。ただし、= 演算子を使って実行される CHARVARCHAR の比較には当てはまりません。

    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 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 = _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 |
    +--------------------------------------------+

User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  Posted by Shannon Black on January 4, 2011
Hi All

So I couldn't find any explanation how to test that a word from one table was partly in a column from the current table. Don't know if you'll make use of this but here's what I came up with:

SELECT a_table, special_table FROM a_table WHERE 'description' LIKE CONCAT('%',special_table.popular_search,'%')

Enjoy
Sign Up Login You must be logged in to post a comment.