表 12.23 その他の関数
名前 | 説明 |
---|---|
DEFAULT() |
テーブルカラムのデフォルト値を返します |
GET_LOCK() |
名前付きロックを取得します |
INET_ATON() |
IP アドレスの数値を返します |
INET_NTOA() |
数値から IP アドレスを返します |
INET6_ATON() (導入 5.6.3) |
IPv6 アドレスの数値を返します |
INET6_NTOA() (導入 5.6.3) |
数値から IPv6 アドレスを返します |
IS_FREE_LOCK() |
名前付きロックが解放されているかどうかを確認します |
IS_IPV4() (導入 5.6.3) |
引数が IPv4 アドレスの場合、true を返します |
IS_IPV4_COMPAT() (導入 5.6.3) |
引数が IPv4 互換アドレスの場合、true を返します |
IS_IPV4_MAPPED() (導入 5.6.3) |
引数が IPv4 マップアドレスの場合、true を返します |
IS_IPV6() (導入 5.6.3) |
引数が IPv6 アドレスの場合、true を返します |
IS_USED_LOCK() |
名前付きロックが使用中かどうかを確認します。true の場合は接続識別子を返します。 |
MASTER_POS_WAIT() |
スレーブが指定された位置まですべての更新を読み取って適用するまで、ブロックします |
NAME_CONST() |
指定された名前がカラムに付けられます |
RELEASE_LOCK() |
名前付きロックを解放します |
SLEEP() |
ある秒数間スリープ状態にします |
UUID() |
ユニバーサル固有識別子 (UUID) を返します |
UUID_SHORT() |
整数値のユニバーサル識別子を返します |
VALUES() |
INSERT で使用される値を定義します |
-
テーブルカラムのデフォルト値を返します。カラムにデフォルト値がない場合は、エラーが発生します。
mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
-
FORMAT(
X
,D
)数値
X
を'#,###,###.##'
のような書式に変換し、小数点第D
位に丸めて、その結果を文字列として返します。詳細は、セクション12.5「文字列関数」を参照してください。 -
timeout
秒のタイムアウトを使用して、文字列str
で指定された名前でロックの取得を試みます。負のtimeout
値は、無限のタイムアウトを表します。ロックの取得に成功した場合は
1
を返し、試行がタイムアウトになった場合 (たとえば、ほかのクライアントがすでにその名前をロックしている場合) は0
を返し、エラー (メモリー不足や mysqladmin kill によるスレッドの停止など) が発生した場合はNULL
を返します。GET_LOCK()
を使用してロックを取得した場合は、RELEASE_LOCK()
を実行したとき、新しいGET_LOCK()
を実行したとき、または接続が切断されたとき (正常または異常を問わず) に解除されます。GET_LOCK()
を使用して取得されたロックは、トランザクションとやりとりを行いません。つまり、トランザクションをコミットしても、トランザクション中に取得されたロックは解除されません。GET_LOCK()
を使用すると、アプリケーションロックを実装したり、レコードロックのシミュレーションを行なったりできます。名前はサーバー全体にわたってロックされます。1 つのセッション内で名前がロックされた場合は、GET_LOCK()
によって、別のセッションによる同じ名前を持つロックのリクエストがブロックされます。これにより、指定されたロック名について合意したクライアントは、その名前を使用すると共同のアドバイザリロックを実行できます。ただし、共同するクライアントのセットに属さないクライアントも、不注意と故意のどちらででも、名前をロックできることに注意してください。したがって、共同するクライアントがその名前をロックできないようにしてください。この可能性を減らす方法の 1 つは、データベース固有またはアプリケーション固有のロック名を使用することです。たとえば、db_name.str
またはapp_name.str
形式のロック名を使用します。mysql> SELECT GET_LOCK('lock1',10); -> 1 mysql> SELECT IS_FREE_LOCK('lock2'); -> 1 mysql> SELECT GET_LOCK('lock2',10); -> 1 mysql> SELECT RELEASE_LOCK('lock2'); -> 1 mysql> SELECT RELEASE_LOCK('lock1'); -> NULL
ロック
'lock1'
は 2 番目のGET_LOCK()
呼び出しによって自動的に解除されるため、2 番目のRELEASE_LOCK()
呼び出しはNULL
を返します。複数のクライアントがロックを待機している場合は、ロックを取得する順序が定義されません。アプリケーションは、ロックリクエストを発行したときと同じ順序でクライアントがロックを取得すると仮定しません。
この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。 -
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.2.6「範囲外およびオーバーフローの処理」を参照してください。 -
数値の IPv4 ネットワークアドレスがネットワークバイト順序で指定された場合、アドレスのドット区切り文字列表現を接続文字セット内の非バイナリ文字列として返します。引数が認識されない場合、
INET_NTOA()
はNULL
を返します。mysql> SELECT INET_NTOA(167773449); -> '10.0.5.9'
-
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%1
やfe80::3%eth0
のような末尾のゾーン ID は許可されません。2001:45f:3:ba::/64
や192.168.1.0/24
のような末尾のネットワークマスクは許可されません。IPv4 アドレスを表す値では、クラスレスアドレスのみがサポートされます。
192.168.1
などのクラスフルアドレスは拒否されます。192.168.1.2:8080
のような末尾のポート番号は許可されません。192.0xa0.1.2
のようなアドレスコンポーネント内の 16 進数は許可されません。8 進数はサポートされていません。192.168.010.1
は192.168.8.1
ではなく、192.168.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'
この関数は、MySQL 5.6.3 で追加されました。
-
バイナリ文字列として数値形式で表現された 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'
この関数は、MySQL 5.6.3 で追加されました。
-
str
という名前が付けられたロックが使用可能であるか (つまり、ロックされていないか) どうかをチェックします。ロックが使用可能である (だれもロックを使用していない) 場合は1
を返し、使用中である場合は0
を返し、エラー (不正な引数など) が発生した場合はNULL
を返します。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。 -
引数が文字列として指定された有効な 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()
と同等の強固さです。この関数は、MySQL 5.6.3 で追加されました。
-
この関数には、
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 進表記法を使用して表現することもできます。たとえば、
192.168.0.1
には、次のような生の 16 進値が含まれます。mysql> SELECT HEX(INET6_ATON('192.168.0.1')); -> 'C0A80001'
IPv4 互換形式で表現された
::192.168.0.1
は、::c0a8:0001
または (先頭のゼロなしの)::c0a8:1
と同等です。mysql> SELECT -> IS_IPV4_COMPAT(INET6_ATON('::192.168.0.1')), -> IS_IPV4_COMPAT(INET6_ATON('::c0a8:0001')), -> IS_IPV4_COMPAT(INET6_ATON('::c0a8:1')); -> 1, 1, 1
この関数は、MySQL 5.6.3 で追加されました。
-
この関数には、
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:192.168.0.1')), -> IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:0001')), -> IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:1')); -> 1, 1, 1
この関数は、MySQL 5.6.3 で追加されました。
-
引数が文字列として指定された有効な IPv6 アドレスの場合は 1 を返し、それ以外の場合は 0 を返します。この関数では、IPv4 アドレスが有効な IPv6 アドレスとみなされません。
mysql> SELECT IS_IPV6('10.0.5.9'), IS_IPV6('::1'); -> 0, 1
特定の引数では、
IS_IPV6()
が 1 を返すと、INET6_ATON()
はNULL
以外を返します。この関数は、MySQL 5.6.3 で追加されました。
-
str
という名前が付けられたロックが使用中であるか (つまり、ロックされているか) どうかをチェックします。その場合は、ロックを保持しているクライアントの接続識別子を返します。そうでない場合は、NULL
を返します。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。 -
MASTER_POS_WAIT(
log_name
,log_pos
[,timeout
])この関数は、マスター/スレーブの同期化を制御する際に役立ちます。スレーブがマスターログで指定された位置までのすべての更新を読み取り、適用するまでブロックします。戻り値は、指定された位置まで進むまでスレーブが待機する必要のあるログイベントの数です。この関数は、スレーブ SQL スレッドが開始されていない場合、スレーブのマスター情報が初期化されていない場合、引数が正しくない場合、またはエラーが発生した場合に
NULL
を返します。タイムアウトを超えた場合は、-1
を返します。MASTER_POS_WAIT()
の待機中にスレーブ SQL スレッドが停止すると、関数はNULL
を返します。スレーブが指定された位置を過ぎると、関数は即座に返します。timeout
値が指定されている場合、MASTER_POS_WAIT()
は、timeout
秒が経過した時点で待機を停止します。timeout
は 0 よりも大きい値にする必要があります。timeout
がゼロまたは負の値である場合は、タイムアウトがないことを意味します。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。 -
指定された値を返します。結果セットのカラムを生成する際に
NAME_CONST()
を使用すると、指定された名前がカラムに付けられます。引数には定数を指定してください。mysql> SELECT NAME_CONST('myname', 14); +--------+ | myname | +--------+ | 14 | +--------+
この関数は、内部でのみ使用されます。セクション20.7「ストアドプログラムのバイナリロギング」で説明したように、ローカルプログラム変数への参照を含むストアドプログラムからステートメントを記述する際に、サーバーで使用されます。この関数は、mysqlbinlog からの出力に表示されることがあります。
アプリケーションで次のような単純なエイリアスを使用しても、上記で示した例とまったく同じ結果を取得できます。
mysql> SELECT 14 AS myname; +--------+ | myname | +--------+ | 14 | +--------+ 1 row in set (0.00 sec)
カラムのエイリアスについての詳細は、セクション13.2.9「SELECT 構文」を参照してください。
-
GET_LOCK()
を使用して取得された文字列str
によって名前が付けられたロックを解除します。ロックが解除された場合は1
を返し、このスレッドによってロックが確立されなかった場合 (その場合、ロックは解除されません) は0
を返し、名前付きのロックが存在しない場合はNULL
を返します。GET_LOCK()
を呼び出しても取得されなかった場合や、事前に解除された場合は、ロックが存在しません。DO
ステートメントは、RELEASE_LOCK()
とともに使用すると便利です。セクション13.2.3「DO 構文」を参照してください。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。 -
duration
引数で指定された秒数間スリープ状態に (一時停止) してから、0 を返します。SLEEP()
が中断された場合は、1 を返します。この期間には、小数部分が含まれている場合もあります。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。 -
1997 年 10 月に The Open Group によって公開された 「DCE 1.1: Remote Procedure Call」 (付録 A) 「CAE (Common Applications Environment) Specifications」(ドキュメント番号 C706、http://www.opengroup.org/public/pubs/catalog/c706.htm)に従って生成されたユニバーサル固有識別子 (UUID) を返します。
UUID は、空間と時間においてグローバルに一意の数字として設計されています。
UUID()
の 2 回の呼び出しが、相互に接続されていない 2 台の異なるコンピュータ上で実行された場合でも、これらの呼び出しでは 2 つの異なる値が生成されると想定されます。UUID は、
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
という書式で、5 つの 16 進数で構成されるutf8
文字列で表現された 128 ビットの数値です。最初の 3 つの数字は、タイムスタンプから生成されます。
4 番目の数字には、(たとえば、サマータイムが原因で) タイムスタンプ値の単調性が失われる場合に備えて、時間の一意性が保持されます。
-
5 番目の数字は、空間の一意性を提供する IEEE 802 ノード番号です。(たとえば、ホストコンピュータに Ethernet カードが搭載されていないことや、オペレーティングシステム上のインタフェースのハードウェアアドレスを見つける方法がわからないことが原因で) 後者を使用できない場合は、ランダムな数字で置き換えられます。この場合、空間の一意性は保証できません。しかしそれでも、競合が発生する可能性は非常に低くなります。
現在、インタフェースの MAC アドレスは、FreeBSD と Linux でのみ考慮されています。その他のオペレーティングシステムでは、ランダムに生成された 48 ビットの数字が MySQL で使用されます。
mysql> SELECT UUID(); -> '6ccd780c-baba-1026-9564-0040f4311e29'
警告UUID()
値の目的は一意性を保つことですが、必ずしも推測不可能または予測不可能であるとはかぎりません。予測不可能性が必要である場合は、UUID 値を何か別の方法で生成してください。注記UUID()
は、ステートメントベースのレプリケーションでは正しく動作しません。 -
(
UUID()
関数で返されるような文字列形式の 128 ビット識別子ではなく)、「短い」ユニバーサル識別子を 64 ビットの符号なし整数として返します。次の条件を満たす場合は、
UUID_SHORT()
の値が一意であることが保証されます。一連のマスター/スレーブサーバーの中で現在のホストの
server_id
が一意であるserver_id
の範囲が 0 から 255 であるmysqld の再起動間にサーバーのシステム時間を戻さない
mysqld の再起動間に、
UUID_SHORT()
を 1 秒あたり平均 1600 万を上回る回数で呼び出さない
UUID_SHORT()
の戻り値は、次のように構成されます。(server_id & 255) << 56 + (server_startup_time_in_seconds << 24) + incremented_variable++;
mysql> SELECT UUID_SHORT(); -> 92395783831158784
注記UUID_SHORT()
は、ステートメントベースのレプリケーションでは正しく動作しません。 -
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.5.3「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);