無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.3 文字列関数 :: 11.3.1 文字列比較関数
« 11.3 文字列関数

11.3.2 正規表現 »
Section Navigation      [Toggle]
  • 11.3 文字列関数
  • 11.3.1 文字列比較関数
  • 11.3.2 正規表現

11.3.1. 文字列比較関数

文字列関数がバイナリ ストリングを引数として与えられている場合、結果ストリングもバイナリ ストリングとなります。ストリングに変換された数字は、バイナリ ストリングとして扱われます。これは比較にのみ影響を及ぼします。

通常、文字列比較の式に大文字小文字の区別のあるものがある場合、その比較は大文字小文字の区別のある様式で行われます。

  • expr LIKE pat [ESCAPE 'escape_char']

    SQL の簡単な正規の比較式を使用してのパターン マッチング。1 ( TRUE ) または 0 ( FALSE ) を戻します。expr もしくは pat のどちらかが NULL である場合、結果は NULL になります。

    パターンはリテラル ストリングである必要があります。例えば、文字列式、またはテーブル カラムとして指定するのでもかまいません。

    SQL 標準に当たり、LIKE は文字ごとにマッチングを行うので、= 比較演算子とは異なる結果を生成することができます。

    mysql> SELECT 'a' LIKE 'ae' COLLATE latin1_german2_ci;
    +-----------------------------------------+
    | 'a' LIKE 'ae' COLLATE latin1_german2_ci |
    +-----------------------------------------+
    |                                       0 |
    +-----------------------------------------+
    mysql> SELECT 'a' = 'ae' COLLATE latin1_german2_ci;
    +--------------------------------------+
    | 'a' = 'ae' COLLATE latin1_german2_ci |
    +--------------------------------------+
    |                                    1 |
    +--------------------------------------+
    

    LIKE では、次のふたつのワイルドカード文字をパターンで使用することができます :

    文字 説明
    % 0 からあらゆる数の文字でもマッチする。
    _ ひとつの文字を明確にマッチする。
    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 文字長である必要があります。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’ と指定します。‘\’ の検索には、‘\\\\’ と指定します。これは、バックスラッシュがパーサによってストリップされ、そしてパターンのマッチが実行された時にもストリップされるため、ひとつのバックスラッシュを残してマッチさせるためです。( 例外 :パターン ストリングの最後では、バックスラッシュは ‘\\’ と指定できます。ストリングの末尾では、エスケープの後に連なるものがないため、バックスラッシュはそのもので独立することができます ) 。

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

  • expr NOT REGEXP pat, expr NOT RLIKE pat

    これは、NOT (expr REGEXP pat) と同様です。

  • expr REGEXP pat, expr RLIKE pat

    パターン pat に対して、ストリングの式 expr のパターン照合を行います。このパターンは拡張正規表現にもなりえます。正規表現の構文については、項11.3.2. 「正規表現」 で説明されています。expr が pat と一致する場合は 1 を戻し、それ以外では 0 を戻します。expr もしくは pat のどちらかが NULL である場合、結果は NULL になります。RLIKE は、mSQL との互換性のために用意された、REGEXP のシノニムです。

    パターンはリテラル ストリングである必要があります。例えば、文字列式、またはテーブル カラムとして指定するのでもかまいません。

    注記 :MySQL は C エスケープ構文をストリングで使用するため ( 例えば、‘\n’ で改行文字を表現 ) 、REGEXP ストリングで使用する ‘\’ はすべて二重にする必要があります。

    REGEXP は、バイナリ ストリングと使用する場合以外では、大文字小文字の区別をしません。

    mysql> SELECT 'Monty!' REGEXP 'm%y%%';
            -> 0
    mysql> SELECT 'Monty!' REGEXP '.*';
            -> 1
    mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
            -> 1
    mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
            -> 1  0
    mysql> SELECT 'a' REGEXP '^[a-d]';
            -> 1
    

    REGEXP および RLIKE は、文字のタイプを決定する際に、現行の文字セットを使用します。デフォルトは latin1 ( cp1252 West European ) です。注意 : これらの演算子はマルチバイトでは安全ではありません。

  • STRCMP(expr1,expr2)

    STRCMP() は、ストリングが同じであれば 0 を戻し、現行のソート順において最初の引数が 2 番目のものより小さい場合は -1 、そしてそれ以外では 1 を戻します。

    mysql> SELECT STRCMP('text', 'text2');
            -> -1
    mysql> SELECT STRCMP('text2', 'text');
            -> 1
    mysql> SELECT STRCMP('text', 'text');
            -> 0
    

    STRCMP() は、比較が行われる際、現行の文字セットを使用します。これによって、デフォルトの比較挙動では、ひとつか双方のオペランドがバイナリ ストリングでない限り、大文字小文字の区別がなくなります。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.