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


12.24 その他の関数

表 12.29 「その他の関数」

名前 説明
ANY_VALUE() ONLY_FULL_GROUP_BY 値の拒否を抑止します
BIN_TO_UUID() バイナリ UUID を文字列に変換
DEFAULT() テーブルカラムのデフォルト値を返します
GROUPING() ROLLUP 行と通常の行の区別
INET_ATON() IP アドレスの数値を返します
INET_NTOA() 数値から IP アドレスを返します
INET6_ATON() IPv6 アドレスの数値を返します
INET6_NTOA() 数値から IPv6 アドレスを返します
IS_IPV4() 引数が IPv4 アドレスかどうか
IS_IPV4_COMPAT() 引数が IPv4 互換アドレスかどうか
IS_IPV4_MAPPED() 引数が IPv4 マップアドレスかどうか
IS_IPV6() 引数が IPv6 アドレスかどうか
IS_UUID() 引数が有効な UUID かどうか
MASTER_POS_WAIT() レプリカが指定された位置までのすべての更新を読み取り、適用するまでブロック
NAME_CONST() カラムの名前を指定
SLEEP() ある秒数間スリープ状態にします
UUID() ユニバーサル固有識別子 (UUID) を返します
UUID_SHORT() 整数値のユニバーサル識別子を返します
UUID_TO_BIN() 文字列 UUID をバイナリに変換
VALUES() INSERT 中に使用する値の定義

  • ANY_VALUE(arg)

    この関数は、MySQL が特定できない理由で有効であるとわかっているクエリーを MySQL が拒否する場合に、ONLY_FULL_GROUP_BY SQL モードが有効な GROUP BY クエリーに役立ちます。 関数の戻り値および型は、その引数の戻り値および型と同じですが、関数の結果は ONLY_FULL_GROUP_BY SQL モードではチェックされません。

    たとえば、name がインデックス付けされていないカラムの場合、次のクエリーは ONLY_FULL_GROUP_BY が有効になっていると失敗します:

    mysql> SELECT name, address, MAX(age) FROM t GROUP BY name;
    ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
    BY clause and contains nonaggregated column 'mydb.t.address' which
    is not functionally dependent on columns in GROUP BY clause; this
    is incompatible with sql_mode=only_full_group_by

    address は、GROUP BY カラム間で名前が付けられておらず、機能的に依存していない非集計カラムであるため、障害が発生します。 その結果、各 name グループ内の行の address 値は非決定的になります。 MySQL でクエリーを受け入れるには、複数の方法があります:

    • テーブルを変更して、name を主キーまたは一意の NOT NULL カラムにします。 これにより、MySQL は、addressname に機能的に依存していること、つまり addressname によって一意に決定されていることを判別できます。 (NULL を有効な name 値として許可する必要がある場合、この方法は適用できません。)

    • ANY_VALUE() を使用して、address を参照します:

      SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

      この場合、MySQL は各 name グループ内の address 値の非決定性を無視し、クエリーを受け入れます。 これは、グループごとに選択される非集計カラムの値を気にしない場合に便利です。 ANY_VALUE() は、SUM()COUNT() などの関数とは異なり、集計関数ではありません。 非決定的なテストを抑制するだけです。

    • ONLY_FULL_GROUP_BY を無効にします。 これは、前の項目で説明したように、ONLY_FULL_GROUP_BY を有効にして ANY_VALUE() を使用することと同等です。

    ANY_VALUE() は、カラム間に関数従属性が存在するが、MySQL がそれを判別できない場合にも役立ちます。 age は機能的にグループ化カラム age-1 に依存しているため、次のクエリーは有効ですが、MySQL は ONLY_FULL_GROUP_BY が有効になっているクエリーを通知および拒否できません:

    SELECT age FROM t GROUP BY age-1;

    MySQL がクエリーを受け入れるようにするには、ANY_VALUE() を使用します:

    SELECT ANY_VALUE(age) FROM t GROUP BY age-1;

    ANY_VALUE() は、GROUP BY 句がない場合に集計関数を参照するクエリーに使用できます:

    mysql> SELECT name, MAX(age) FROM t;
    ERROR 1140 (42000): In aggregated query without GROUP BY, expression
    #1 of SELECT list contains nonaggregated column 'mydb.t.name'; this
    is incompatible with sql_mode=only_full_group_by

    GROUP BY がない場合、単一のグループが存在し、どの name 値をグループに選択するかは非決定的です。 ANY_VALUE() は、クエリーを受け入れるように MySQL に指示します:

    SELECT ANY_VALUE(name), MAX(age) FROM t;

    特定のデータセットの一部のプロパティのために、選択した非集計カラムが GROUP BY カラムに実質的に依存していることがわかっている場合があります。 たとえば、アプリケーションでは、あるカラムを別のカラムに対して一意にすることができます。 この場合、効果的に機能的に依存するカラムに ANY_VALUE() を使用すると意味がある可能性があります。

    追加の説明については、セクション12.20.3「MySQL での GROUP BY の処理」を参照してください。

  • BIN_TO_UUID(binary_uuid), BIN_TO_UUID(binary_uuid, swap_flag)

    BIN_TO_UUID() は、UUID_TO_BIN() の逆です。 バイナリ UUID を文字列 UUID に変換し、結果を返します。 バイナリ値は、VARBINARY(16) 値として UUID である必要があります。 戻り値は、ダッシュで区切られた 5 つの 16 進数の utf8 文字列です。 (この形式の詳細は、UUID() 関数の説明を参照してください。) UUID 引数が NULL の場合、戻り値は NULL です。 無効な引数がある場合は、エラーが発生します。

    BIN_TO_UUID() は、次のいずれかまたは 2 つの引数を取ります:

    • 1 つの引数形式はバイナリ UUID 値を取ります。 UUID 値は、その時間の低い部分と時間の高い部分がスワップされていないと想定されます。 文字列の結果は、バイナリ引数と同じ順序になります。

    • 2 つの引数形式は、バイナリ UUID 値と swap-flag 値を取ります:

      • swap_flag が 0 の場合、2 つの引数の形式は 1 つの引数の形式と同等です。 文字列の結果は、バイナリ引数と同じ順序になります。

      • swap_flag が 1 の場合、UUID 値には時間の低い部分と時間の高い部分がスワップされているとみなされます。 これらのパーツは、結果値の元の位置にスワップバックされます。

    使用例および時間部分スワッピングの詳細は、UUID_TO_BIN() 関数の説明を参照してください。

  • DEFAULT(col_name)

    テーブルカラムのデフォルト値を返します。 カラムにデフォルト値がない場合は、エラーが発生します。

    名前付きカラムのデフォルト値を指定するための DEFAULT(col_name) の使用は、リテラルのデフォルト値を持つカラムにのみ許可され、式のデフォルト値を持つカラムには許可されません。

    mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
  • FORMAT(X,D)

    数値 X'#,###,###.##' のような書式に変換し、小数点第 D 位に丸めて、その結果を文字列として返します。 詳細は、セクション12.8「文字列関数および演算子」を参照してください。

  • GROUPING(expr [, expr] ...)

    WITH ROLLUP 修飾子を含む GROUP BY クエリーの場合、ROLLUP 操作により、NULL がすべての値のセットを表す超集計出力行が生成されます。 GROUPING() 関数を使用すると、スーパー集計行の NULL 値を、通常のグループ化された行の NULL 値と区別できます。

    GROUPING() は、SELECT リストまたは HAVING 句でのみ使用できます。

    GROUPING() の各引数は、GROUP BY 句の式と完全に一致する式である必要があります。 式は位置指定子にできません。 現在の行の式の値がスーパー集計値を表す NULL である場合、GROUPING() は式ごとに 1 を生成します。 それ以外の場合、GROUPING() は、式の値が正規結果行の NULL であるか、NULL ではないことを示す 0 を生成します。

    テーブル t1 に次の行が含まれ、NULLother不明などを示しているとします:

    mysql> SELECT * FROM t1;
    +------+-------+----------+
    | name | size  | quantity |
    +------+-------+----------+
    | ball | small |       10 |
    | ball | large |       20 |
    | ball | NULL  |        5 |
    | hoop | small |       15 |
    | hoop | large |        5 |
    | hoop | NULL  |        3 |
    +------+-------+----------+

    WITH ROLLUP を使用しないテーブルのサマリーは、次のようになります:

    mysql> SELECT name, size, SUM(quantity) AS quantity
           FROM t1
           GROUP BY name, size;
    +------+-------+----------+
    | name | size  | quantity |
    +------+-------+----------+
    | ball | small |       10 |
    | ball | large |       20 |
    | ball | NULL  |        5 |
    | hoop | small |       15 |
    | hoop | large |        5 |
    | hoop | NULL  |        3 |
    +------+-------+----------+

    結果には NULL 値が含まれていますが、クエリーには WITH ROLLUP が含まれていないため、それらは上位集計行を表していません。

    WITH ROLLUP を追加すると、追加の NULL 値を含む上位集計サマリー行が生成されます。 ただし、この結果を前の結果と比較しないと、どの NULL 値がスーパー集計行に出現し、どの値が通常のグループ化された行に出現するかを簡単に確認できません:

    mysql> SELECT name, size, SUM(quantity) AS quantity
           FROM t1
           GROUP BY name, size WITH ROLLUP;
    +------+-------+----------+
    | name | size  | quantity |
    +------+-------+----------+
    | ball | NULL  |        5 |
    | ball | large |       20 |
    | ball | small |       10 |
    | ball | NULL  |       35 |
    | hoop | NULL  |        3 |
    | hoop | large |        5 |
    | hoop | small |       15 |
    | hoop | NULL  |       23 |
    | NULL | NULL  |       58 |
    +------+-------+----------+

    スーパー集計行の NULL 値を通常のグループ化行の NULL 値と区別するには、GROUPING() を使用します。これは、スーパー集計 NULL 値に対してのみ 1 を返します:

    mysql> SELECT
             name, size, SUM(quantity) AS quantity,
             GROUPING(name) AS grp_name,
             GROUPING(size) AS grp_size
           FROM t1
           GROUP BY name, size WITH ROLLUP;
    +------+-------+----------+----------+----------+
    | name | size  | quantity | grp_name | grp_size |
    +------+-------+----------+----------+----------+
    | ball | NULL  |        5 |        0 |        0 |
    | ball | large |       20 |        0 |        0 |
    | ball | small |       10 |        0 |        0 |
    | ball | NULL  |       35 |        0 |        1 |
    | hoop | NULL  |        3 |        0 |        0 |
    | hoop | large |        5 |        0 |        0 |
    | hoop | small |       15 |        0 |        0 |
    | hoop | NULL  |       23 |        0 |        1 |
    | NULL | NULL  |       58 |        1 |        1 |
    +------+-------+----------+----------+----------+

    GROUPING() の一般的な使用方法:

    • スーパー集計の NULL 値をラベルに置き換えます:

      mysql> SELECT
               IF(GROUPING(name) = 1, 'All items', name) AS name,
               IF(GROUPING(size) = 1, 'All sizes', size) AS size,
               SUM(quantity) AS quantity
             FROM t1
             GROUP BY name, size WITH ROLLUP;
      +-----------+-----------+----------+
      | name      | size      | quantity |
      +-----------+-----------+----------+
      | ball      | NULL      |        5 |
      | ball      | large     |       20 |
      | ball      | small     |       10 |
      | ball      | All sizes |       35 |
      | hoop      | NULL      |        3 |
      | hoop      | large     |        5 |
      | hoop      | small     |       15 |
      | hoop      | All sizes |       23 |
      | All items | All sizes |       58 |
      +-----------+-----------+----------+
    • 通常のグループ化された明細をフィルタで除外して、超集約明細のみを返します:

      mysql> SELECT name, size, SUM(quantity) AS quantity
             FROM t1
             GROUP BY name, size WITH ROLLUP
             HAVING GROUPING(name) = 1 OR GROUPING(size) = 1;
      +------+------+----------+
      | name | size | quantity |
      +------+------+----------+
      | ball | NULL |       35 |
      | hoop | NULL |       23 |
      | NULL | NULL |       58 |
      +------+------+----------+

    GROUPING() では、複数の式引数が許可されます。 この場合、GROUPING() の戻り値は、各式の結果から結合されたビットマスクを表します。ここで、最下位ビットは右端の式の結果に対応します。 たとえば、式の引数が 3 つある場合、GROUPING(expr1, expr2, expr3) は次のように評価されます:

      result for GROUPING(expr3)
    + result for GROUPING(expr2) << 1
    + result for GROUPING(expr1) << 2

    次のクエリーは、複数引数コールで単一の引数の GROUPING() 結果を組み合せてビットマスク値を生成する方法を示しています:

    mysql> SELECT
             name, size, SUM(quantity) AS quantity,
             GROUPING(name) AS grp_name,
             GROUPING(size) AS grp_size,
           GROUPING(name, size) AS grp_all
           FROM t1
           GROUP BY name, size WITH ROLLUP;
    +------+-------+----------+----------+----------+---------+
    | name | size  | quantity | grp_name | grp_size | grp_all |
    +------+-------+----------+----------+----------+---------+
    | ball | NULL  |        5 |        0 |        0 |       0 |
    | ball | large |       20 |        0 |        0 |       0 |
    | ball | small |       10 |        0 |        0 |       0 |
    | ball | NULL  |       35 |        0 |        1 |       1 |
    | hoop | NULL  |        3 |        0 |        0 |       0 |
    | hoop | large |        5 |        0 |        0 |       0 |
    | hoop | small |       15 |        0 |        0 |       0 |
    | hoop | NULL  |       23 |        0 |        1 |       1 |
    | NULL | NULL  |       58 |        1 |        1 |       3 |
    +------+-------+----------+----------+----------+---------+

    複数の式引数では、いずれかの式がスーパー集計値を表す場合、GROUPING() の戻り値はゼロ以外になります。 したがって、複数引数の GROUPING() 構文では、複数の単一引数コールではなく単一の複数引数 GROUPING() コールを使用して、上位集計行のみを戻す以前のクエリーを簡単に記述できます:

    mysql> SELECT name, size, SUM(quantity) AS quantity
           FROM t1
           GROUP BY name, size WITH ROLLUP
           HAVING GROUPING(name, size) <> 0;
    +------+------+----------+
    | name | size | quantity |
    +------+------+----------+
    | ball | NULL |       35 |
    | hoop | NULL |       23 |
    | NULL | NULL |       58 |
    +------+------+----------+

    GROUPING() の使用には、次の制限事項があります:

    • 照合が失敗する可能性があるため、サブクエリーの GROUP BY 式を GROUPING() 引数として使用しないでください。 たとえば、次のクエリーの照合は失敗します:

      mysql> SELECT GROUPING((SELECT MAX(name) FROM t1))
             FROM t1
             GROUP BY (SELECT MAX(name) FROM t1) WITH ROLLUP;
      ERROR 3580 (HY000): Argument #1 of GROUPING function is not in GROUP BY
    • GROUP BY リテラル式は、HAVING 句内で GROUPING() 引数として使用しないでください。 オプティマイザが GROUP BYHAVING を評価するタイミングの違いにより、照合は成功する可能性がありますが、GROUPING() の評価では予期した結果が生成されません。 次のクエリーについて考えてみます:

      SELECT a AS f1, 'w' AS f2
      FROM t
      GROUP BY f1, f2 WITH ROLLUP
      HAVING GROUPING(f2) = 1;

      GROUPING() は、リテラル定数式に対して、HAVING 句全体より早く評価され、0 を返します。 このようなクエリーが影響を受けるかどうかを確認するには、EXPLAIN を使用して Extra カラムで Impossible having を探します。

    WITH ROLLUP および GROUPING() の詳細は、セクション12.20.2「GROUP BY 修飾子」 を参照してください。

  • INET_ATON(expr)

    IPv4 ネットワークアドレスのドット区切り表現が文字列として指定された場合、アドレスの数値を表す整数をネットワークバイト順序 (ビッグエンディアン) で返します。 引数が認識されない場合、INET_ATON()NULL を返します。

    mysql> SELECT INET_ATON('10.0.5.9');
            -> 167773449

    この例では、戻り値は 10×2563 + 0×2562 + 5×256 + 9 として計算されます。

    INET_ATON() は、短い形式の IP アドレス ('127.0.0.1' の表現として '127.1' など) の場合に、非 NULL を返す場合と返さない場合があります。 このため、このようなアドレスには INET_ATON() を使用しないでください。

    注記

    INET_ATON() で生成された値を格納するには、署名される INT ではなく、INT UNSIGNED カラムを使用します。 署名付きのカラムを使用する場合は、第 1 オクテットが 127 よりも大きい IP アドレスに対応する値を正常に格納できません。 セクション11.1.7「範囲外およびオーバーフローの処理」を参照してください。

  • INET_NTOA(expr)

    ネットワークバイト順に数値の IPv4 ネットワークアドレスを指定すると、接続文字セットの文字列としてアドレスのドット区切りの文字列表現を戻します。 引数が認識されない場合、INET_NTOA()NULL を返します。

    mysql> SELECT INET_NTOA(167773449);
            -> '10.0.5.9'
  • INET6_ATON(expr)

    IPv6 または IPv4 ネットワークアドレスが文字列として指定された場合、アドレスの数値を表すバイナリ文字列をネットワークバイト順序 (ビッグエンディアン) で返します。 数値書式の IPv6 アドレスでは最大の整数型よりも大きいバイトが必要であるため、この関数で返される表現のデータ型は、VARBINARY (IPv6 アドレスの場合は VARBINARY(16)、IPv4 アドレスの場合は VARBINARY(4)) です。 引数が有効なアドレスでない場合、INET6_ATON()NULL を返します。

    次の例では、HEX() を使用して INET6_ATON() の結果を出力可能な形式で表示します。

    mysql> SELECT HEX(INET6_ATON('fdfe::5a55:caff:fefa:9089'));
            -> 'FDFE0000000000005A55CAFFFEFA9089'
    mysql> SELECT HEX(INET6_ATON('10.0.5.9'));
            -> '0A000509'

    INET6_ATON() は、有効な引数上の複数の制約を監視します。 これらについては、次のリストに例とともに示します。

    • fe80::3%1fe80::3%eth0 のような末尾のゾーン ID は許可されません。

    • 2001:45f:3:ba::/64198.51.100.0/24 のような末尾のネットワークマスクは許可されません。

    • IPv4 アドレスを表す値では、クラスレスアドレスのみがサポートされます。 198.51.1 などのクラスフルアドレスは拒否されます。 198.51.100.2:8080 のような末尾のポート番号は許可されません。 198.0xa0.1.2 のようなアドレスコンポーネント内の 16 進数は許可されません。 8 進数はサポートされていません。198.51.010.1198.51.8.1 ではなく、198.51.10.1 として処理されます。 このような IPv4 の制約は、IPv4 アドレス部分を持つ IPv6 アドレス (IPv4 互換アドレスや IPv4 マップアドレスなど) にも適用されます。

    INT 値として数値形式で表現された IPv4 アドレス expr を、VARBINARY 値として数値形式で表現された IPv6 アドレスに変換するには、次の式を使用します。

    INET6_ATON(INET_NTOA(expr))

    例:

    mysql> SELECT HEX(INET6_ATON(INET_NTOA(167773449)));
            -> '0A000509'
  • INET6_NTOA(expr)

    数値形式でバイナリ文字列として表される IPv6 または IPv4 ネットワークアドレスを指定すると、接続文字セットの文字列としてアドレスの文字列表現を返します。 引数が有効なアドレスでない場合、INET6_NTOA()NULL を返します。

    INET6_NTOA() には、次のようなプロパティーがあります。

    • 変換はオペレーティングシステムの機能を使用して実行されないため、出力文字列はプラットフォームに依存しません。

    • 戻り文字列の最大長は 39 (4 x 8 + 7) です。 次のステートメントが指定された場合、

      CREATE TABLE t AS SELECT INET6_NTOA(expr) AS c1;

      結果として生成されるテーブルに次の定義が含まれます。

      CREATE TABLE t (c1 VARCHAR(39) CHARACTER SET utf8 DEFAULT NULL);
    • 戻り文字列では、IPv6 アドレスを表す小文字が使用されます。

    mysql> SELECT INET6_NTOA(INET6_ATON('fdfe::5a55:caff:fefa:9089'));
            -> 'fdfe::5a55:caff:fefa:9089'
    mysql> SELECT INET6_NTOA(INET6_ATON('10.0.5.9'));
            -> '10.0.5.9'
    
    mysql> SELECT INET6_NTOA(UNHEX('FDFE0000000000005A55CAFFFEFA9089'));
            -> 'fdfe::5a55:caff:fefa:9089'
    mysql> SELECT INET6_NTOA(UNHEX('0A000509'));
            -> '10.0.5.9'
  • IS_IPV4(expr)

    引数が文字列として指定された有効な IPv4 アドレスの場合は 1 を返し、それ以外の場合は 0 を返します。

    mysql> SELECT IS_IPV4('10.0.5.9'), IS_IPV4('10.0.5.256');
            -> 1, 0

    特定の引数について、IS_IPV4() が 1 を返した場合、INET_ATON() (および INET6_ATON()) は NULL 以外を返します。 逆のステートメントは該当しません。一部のケースでは、IS_IPV4() が 0 を返すと、INET_ATON()NULL 以外を返します。

    上記の備考で示したように、IS_IPV4() は、有効な IPv4 アドレスを構成するものに関して、INET_ATON() よりも厳密であるため、無効な値に対して強固なチェックを実行する必要のあるアプリケーションで役立つことがあります。 または、INET6_ATON() を使用して、IPv4 アドレスを内部形式に変換し、(無効なアドレスを示す) NULL の結果をチェックします。 INET6_ATON() は、IPv4 アドレスのチェックという点では、IS_IPV4() と同等の強固さです。

  • IS_IPV4_COMPAT(expr)

    この関数には、INET6_ATON() で返されるように、バイナリ文字列として数値形式で表現された IPv6 アドレスが指定されます。 引数が有効な IPv4 互換 IPv6 アドレスの場合は 1 を返し、それ以外の場合は 0 を返します。 IPv4 互換アドレスの形式は、::ipv4_address です。

    mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));
            -> 1
    mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::ffff:10.0.5.9'));
            -> 0

    IPv4 互換アドレスの IPv4 部分は、16 進表記法を使用して表現することもできます。 たとえば、198.51.100.1 には、次のような生の 16 進値が含まれます。

    mysql> SELECT HEX(INET6_ATON('198.51.100.1'));
            -> 'C6336401'

    IPv4 互換形式で表現された ::198.51.100.1 は、::c0a8:0001 または (先頭のゼロなしの) ::c0a8:1 と同等です。

    mysql> SELECT
        ->   IS_IPV4_COMPAT(INET6_ATON('::198.51.100.1')),
        ->   IS_IPV4_COMPAT(INET6_ATON('::c0a8:0001')),
        ->   IS_IPV4_COMPAT(INET6_ATON('::c0a8:1'));
            -> 1, 1, 1
  • IS_IPV4_MAPPED(expr)

    この関数には、INET6_ATON() で返されるように、バイナリ文字列として数値形式で表現された IPv6 アドレスが指定されます。 引数が有効な IPv4 マップ IPv6 アドレスの場合は 1 を返し、それ以外の場合は 0 を返します。 IPv4 マップアドレスの形式は、::ffff:ipv4_address です。

    mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9'));
            -> 0
    mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:10.0.5.9'));
            -> 1

    IS_IPV4_COMPAT() と同様に、IPv4 マップアドレスの IPv4 部分は、16 進表記法を使用して表現することもできます。

    mysql> SELECT
        ->   IS_IPV4_MAPPED(INET6_ATON('::ffff:198.51.100.1')),
        ->   IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:0001')),
        ->   IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:1'));
            -> 1, 1, 1
  • IS_IPV6(expr)

    引数が文字列として指定された有効な IPv6 アドレスの場合は 1 を返し、それ以外の場合は 0 を返します。 この関数では、IPv4 アドレスが有効な IPv6 アドレスとみなされません。

    mysql> SELECT IS_IPV6('10.0.5.9'), IS_IPV6('::1');
            -> 0, 1

    特定の引数について、IS_IPV6() が 1 を返した場合、INET6_ATON()NULL 以外を返します。

  • IS_UUID(string_uuid)

    引数が有効な文字列形式 UUID の場合は 1、引数が有効な UUID でない場合は 0、引数が NULL の場合は NULL を返します。

    「有効」は、値が解析可能な形式であることを意味します。 つまり、正しい長さで、許可されている文字のみが含まれます (任意の文字の 16 進数の数字と、オプションでダッシュおよび中カッコ)。 この形式は最も一般的です:

    aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

    次の形式も使用できます:

    aaaaaaaabbbbccccddddeeeeeeeeeeee
    {aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}

    値内のフィールドの意味については、UUID() 関数の説明を参照してください。

    mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db');
    +-------------------------------------------------+
    | IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db') |
    +-------------------------------------------------+
    |                                               1 |
    +-------------------------------------------------+
    mysql> SELECT IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB');
    +-------------------------------------------------+
    | IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB') |
    +-------------------------------------------------+
    |                                               1 |
    +-------------------------------------------------+
    mysql> SELECT IS_UUID('6ccd780cbaba102695645b8c656024db');
    +---------------------------------------------+
    | IS_UUID('6ccd780cbaba102695645b8c656024db') |
    +---------------------------------------------+
    |                                           1 |
    +---------------------------------------------+
    mysql> SELECT IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}');
    +---------------------------------------------------+
    | IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}') |
    +---------------------------------------------------+
    |                                                 1 |
    +---------------------------------------------------+
    mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c6560');
    +---------------------------------------------+
    | IS_UUID('6ccd780c-baba-1026-9564-5b8c6560') |
    +---------------------------------------------+
    |                                           0 |
    +---------------------------------------------+
    mysql> SELECT IS_UUID(RAND());
    +-----------------+
    | IS_UUID(RAND()) |
    +-----------------+
    |               0 |
    +-----------------+
  • MASTER_POS_WAIT(log_name,log_pos[,timeout][,channel])

    この関数は、ソース/レプリカの同期化の制御に役立ちます。 レプリカがソースバイナリログ内の指定された位置までのすべての更新を読み取って適用するまでブロックされます。 戻り値は、レプリカが指定された位置に進むまで待機する必要があったログイベントの数です。 レプリケーション SQL スレッドが開始されていない場合、レプリカソース情報が初期化されていない場合、引数が正しくない場合、またはエラーが発生した場合、関数は NULL を戻します。 タイムアウトを超えた場合は、-1 を返します。 MASTER_POS_WAIT() の待機中にレプリケーション SQL スレッドが停止した場合、この関数は NULL を戻します。 レプリカが指定された位置を過ぎた場合、関数はただちに戻ります。

    マルチスレッドのレプリカでは、この関数は、レプリカのステータスを更新するためにチェックポイント操作がコールされたときに、slave_checkpoint_group または slave_checkpoint_period システム変数によって設定された制限の期限が切れるまで待機します。 したがって、システム変数の設定によっては、この関数は指定された位置に達した後に時間を返す場合があります。

    バイナリログのトランザクション圧縮が使用中で、指定された位置のトランザクションペイロードが (Transaction_payload_event として) 圧縮されている場合、この関数はトランザクション全体が読み取られて適用され、位置が更新されるまで待機します。

    timeout 値が指定されている場合、MASTER_POS_WAIT() は、timeout 秒が経過した時点で待機を停止します。timeout は 0 よりも大きい値にする必要があります。timeout がゼロまたは負の値である場合は、タイムアウトがないことを意味します。

    オプションの channel 値を使用すると、関数が適用されるレプリケーションチャネルの名前を指定できます。 詳しくはセクション17.2.2「レプリケーションチャネル」をご覧ください。

    この関数は、ステートメントベースのレプリケーションでは安全に使用できません。 binlog_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

  • NAME_CONST(name,value)

    指定された値を返します。 結果セットのカラムを生成する際に NAME_CONST() を使用すると、指定された名前がカラムに付けられます。 引数には定数を指定してください。

    mysql> SELECT NAME_CONST('myname', 14);
    +--------+
    | myname |
    +--------+
    |     14 |
    +--------+

    この関数は、内部でのみ使用されます。 サーバーは、セクション25.7「ストアドプログラムバイナリロギング」 で説明されているように、ローカルプログラム変数への参照を含むストアドプログラムからステートメントを記述するときに使用します。 この関数は、mysqlbinlog からの出力に表示される場合があります。

    アプリケーションで次のような単純なエイリアスを使用しても、上記で示した例とまったく同じ結果を取得できます。

    mysql> SELECT 14 AS myname;
    +--------+
    | myname |
    +--------+
    |     14 |
    +--------+
    1 row in set (0.00 sec)

    カラムのエイリアスについての詳細は、セクション13.2.10「SELECT ステートメント」を参照してください。

  • SLEEP(duration)

    duration 引数で指定された秒数間スリープ状態に (一時停止) してから、0 を返します。 この期間には、小数部分が含まれている場合もあります。 引数が NULL または負の場合、SLEEP() は厳密な SQL モードで警告またはエラーを生成します。

    スリープが正常に (中断なしで) 復帰すると、0 が返されます:

    mysql> SELECT SLEEP(1000);
    +-------------+
    | SLEEP(1000) |
    +-------------+
    |           0 |
    +-------------+

    SLEEP() が、中断されたクエリーによって起動される唯一のものである場合、1 を返し、クエリー自体はエラーを返しません。 これは、クエリーが強制終了されたかタイムアウトしたかにかかわらず当てはまります:

    • このステートメントは、別のセッションから KILL QUERY を使用して中断されます:

      mysql> SELECT SLEEP(1000);
      +-------------+
      | SLEEP(1000) |
      +-------------+
      |           1 |
      +-------------+
    • このステートメントは、タイムアウトによって中断されます:

      mysql> SELECT /*+ MAX_EXECUTION_TIME(1) */ SLEEP(1000);
      +-------------+
      | SLEEP(1000) |
      +-------------+
      |           1 |
      +-------------+

    SLEEP() が中断されたクエリーの一部である場合、クエリーはエラーを返します:

    • このステートメントは、別のセッションから KILL QUERY を使用して中断されます:

      mysql> SELECT 1 FROM t1 WHERE SLEEP(1000);
      ERROR 1317 (70100): Query execution was interrupted
    • このステートメントは、タイムアウトによって中断されます:

      mysql> SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM t1 WHERE SLEEP(1000);
      ERROR 3024 (HY000): Query execution was interrupted, maximum statement
      execution time exceeded

    この関数は、ステートメントベースのレプリケーションでは安全に使用できません。 binlog_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

  • UUID()

    RFC 4122, 「汎用一意の IDentifier (UUID) URN ネームスペース」 (http://www.ietf.org/rfc/rfc4122.txt) に従って生成された Universal Unique Identifier (UUID) を返します。

    UUID は、空間と時間においてグローバルに一意の数字として設計されています。 これらのコールが相互に接続されていない 2 つの別々のデバイスで実行された場合でも、UUID() への 2 つのコールでは 2 つの異なる値が生成されることが予想されます。

    警告

    UUID() 値の目的は一意性を保つことですが、必ずしも推測不可能または予測不可能であるとはかぎりません。 予測不可能性が必要である場合は、UUID 値を何か別の方法で生成してください。

    UUID() は、RFC 4122 で説明されている UUID バージョン 1 に準拠する値を返します。 値は 128 ビットの数値で、aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 形式の 5 つの 16 進数の utf8 文字列として表されます:

    • 最初の 3 つの数値は、タイムスタンプの下位、中間および上位の部分から生成されます。 上位には UUID バージョン番号も含まれます。

    • 4 番目の数字には、(たとえば、サマータイムが原因で) タイムスタンプ値の単調性が失われる場合に備えて、時間の一意性が保持されます。

    • 5 番目の数字は、空間の一意性を提供する IEEE 802 ノード番号です。 ランダムな番号が代入されるのは、後者が使用できない場合です (たとえば、ホストデバイスにイーサネットカードがない場合や、ホストオペレーティングシステムでインタフェースのハードウェアアドレスを検出する方法が不明な場合など)。 この場合、空間の一意性は保証できません。 しかしそれでも、競合が発生する可能性は非常に低くなります。

      インタフェースの MAC アドレスは、FreeBSD、Linux および Windows でのみ考慮されます。 その他のオペレーティングシステムでは、ランダムに生成された 48 ビットの数字が MySQL で使用されます。

    mysql> SELECT UUID();
            -> '6ccd780c-baba-1026-9564-5b8c656024db'

    文字列とバイナリ UUID の値を変換するには、UUID_TO_BIN() 関数と BIN_TO_UUID() 関数を使用します。 文字列が有効な UUID 値であるかどうかを確認するには、IS_UUID() 関数を使用します。

    この関数は、ステートメントベースのレプリケーションでは安全に使用できません。 binlog_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

  • UUID_SHORT()

    short 汎用識別子を 64 ビット符号なし整数として返します。 UUID_SHORT() によって返される値は、UUID() 関数によって返される文字列形式 128 ビット識別子とは異なり、一意性プロパティが異なります。 次の条件を満たす場合は、UUID_SHORT() の値が一意であることが保証されます。

    • 現在のサーバーの server_id 値は 0 から 255 の間で、ソースサーバーとレプリカサーバーのセット間で一意です

    • mysqld の再起動間にサーバーホストのシステム時間を設定しません

    • mysqld の再起動間に、平均 16 百万回/秒未満で UUID_SHORT() を起動

    UUID_SHORT() の戻り値は、次のように構成されます。

      (server_id & 255) << 56
    + (server_startup_time_in_seconds << 24)
    + incremented_variable++;
    mysql> SELECT UUID_SHORT();
            -> 92395783831158784
    注記

    UUID_SHORT() は、ステートメントベースのレプリケーションでは正しく動作しません。

  • UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuid, swap_flag)

    文字列 UUID をバイナリ UUID に変換し、結果を返します。 (IS_UUID() 関数の説明には、許可されている文字列 UUID 形式がリストされます。) 戻りバイナリ UUID は VARBINARY(16) 値です。 UUID 引数が NULL の場合、戻り値は NULL です。 無効な引数がある場合は、エラーが発生します。

    UUID_TO_BIN() は、次のいずれかまたは 2 つの引数を取ります:

    • 1 つの引数形式は、文字列 UUID 値を取ります。 バイナリ結果は、文字列引数と同じ順序になります。

    • 2 つの引数形式は、文字列 UUID 値とフラグ値を取ります:

      • swap_flag が 0 の場合、2 つの引数の形式は 1 つの引数の形式と同等です。 バイナリ結果は、文字列引数と同じ順序になります。

      • swap_flag が 1 の場合、戻り値の形式は異なります: time-low 部分と time-high 部分 (それぞれ 16 進数の最初と 3 番目のグループ) がスワップされます。 これにより、より迅速に変化する部分が右側に移動し、結果がインデックス付けされたカラムに格納されている場合はインデックス付けの効率を向上させることができます。

    タイムパーティススワッピングでは、UUID バージョン 1 の値 (UUID() 関数によって生成される値など) を使用することを前提としています。 他の方法で生成された UUID 値がバージョン 1 形式に従っていない場合、時間部分スワッピングには利点がありません。 バージョン 1 形式の詳細は、UUID() 関数の説明を参照してください。

    次の文字列 UUID 値があるとします:

    mysql> SET @uuid = '6ccd780c-baba-1026-9564-5b8c656024db';

    時間部分スワップの有無にかかわらず文字列 UUID をバイナリに変換するには、UUID_TO_BIN() を使用します:

    mysql> SELECT HEX(UUID_TO_BIN(@uuid));
    +----------------------------------+
    | HEX(UUID_TO_BIN(@uuid))          |
    +----------------------------------+
    | 6CCD780CBABA102695645B8C656024DB |
    +----------------------------------+
    mysql> SELECT HEX(UUID_TO_BIN(@uuid, 0));
    +----------------------------------+
    | HEX(UUID_TO_BIN(@uuid, 0))       |
    +----------------------------------+
    | 6CCD780CBABA102695645B8C656024DB |
    +----------------------------------+
    mysql> SELECT HEX(UUID_TO_BIN(@uuid, 1));
    +----------------------------------+
    | HEX(UUID_TO_BIN(@uuid, 1))       |
    +----------------------------------+
    | 1026BABA6CCD780C95645B8C656024DB |
    +----------------------------------+

    UUID_TO_BIN() によって返されたバイナリ UUID を文字列 UUID に変換するには、BIN_TO_UUID() を使用します。 時間部分を入れ替えるために、第 2 引数 1 を指定して UUID_TO_BIN() を呼び出してバイナリ UUID を生成する場合は、バイナリ UUID を文字列 UUID に戻すときに時間部分のスワップを解除するために、第 2 引数 1 を BIN_TO_UUID() に渡すことも必要です:

    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid));
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid))      |
    +--------------------------------------+
    | 6ccd780c-baba-1026-9564-5b8c656024db |
    +--------------------------------------+
    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0)  |
    +--------------------------------------+
    | 6ccd780c-baba-1026-9564-5b8c656024db |
    +--------------------------------------+
    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1)  |
    +--------------------------------------+
    | 6ccd780c-baba-1026-9564-5b8c656024db |
    +--------------------------------------+

    時間部分スワッピングの使用が両方の方向の変換で同じでない場合、元の UUID は適切にリカバリされません:

    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1)  |
    +--------------------------------------+
    | baba1026-780c-6ccd-9564-5b8c656024db |
    +--------------------------------------+
    mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0);
    +--------------------------------------+
    | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0)  |
    +--------------------------------------+
    | 1026baba-6ccd-780c-9564-5b8c656024db |
    +--------------------------------------+
  • VALUES(col_name)

    INSERT ... ON DUPLICATE KEY UPDATE ステートメントでは、UPDATE 句の VALUES(col_name) 関数を使用すると、ステートメントの INSERT 部分からカラム値を参照できます。 つまり、UPDATE 句の VALUES(col_name) は、挿入される col_name 値を参照するため、重複キーの競合が発生しなくなります。 この関数は、複数の行を挿入する際に特に役立ちます。 VALUES() 関数は、INSERT ステートメントの ON DUPLICATE KEY UPDATE 句でのみ有効であり、それ以外の場合は NULL を返します。 セクション13.2.6.2「INSERT ... ON DUPLICATE KEY UPDATE ステートメント」を参照してください。

    mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
        -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
    重要

    この使用方法は MySQL 8.0.20 では非推奨であり、MySQL の将来のリリースで削除される予定です。 かわりに、行のエイリアスまたは行とカラムのエイリアスを使用してください。 詳細および例については、セクション13.2.6.2「INSERT ... ON DUPLICATE KEY UPDATE ステートメント」を参照してください。


関連キーワード:  UUID, 関数, INET, アドレス, BIN, GROUPING, ATON, size, 形式, カラム