Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


12.18 その他の関数

表 12.23 その他の関数

名前 説明
DEFAULT() テーブルカラムのデフォルト値を返します
GET_LOCK() 名前付きロックを取得します
INET_ATON() IP アドレスの数値を返します
INET_NTOA() 数値から IP アドレスを返します
INET6_ATON() IPv6 アドレスの数値を返します
INET6_NTOA() 数値から IPv6 アドレスを返します
IS_FREE_LOCK() 名前付きロックが解放されているかどうかを確認します
IS_IPV4() 引数が IPv4 アドレスの場合、true を返します
IS_IPV4_COMPAT() 引数が IPv4 互換アドレスの場合、true を返します
IS_IPV4_MAPPED() 引数が IPv4 マップアドレスの場合、true を返します
IS_IPV6() 引数が IPv6 アドレスの場合、true を返します
IS_USED_LOCK() 名前付きロックが使用中かどうかを確認します。true の場合は接続識別子を返します。
MASTER_POS_WAIT() スレーブが指定された位置まですべての更新を読み取って適用するまで、ブロックします
NAME_CONST() 指定された名前がカラムに付けられます
RAND() ランダムな浮動小数点値を返します
RELEASE_LOCK() 名前付きロックを解放します
SLEEP() ある秒数間スリープ状態にします
UUID() ユニバーサル固有識別子 (UUID) を返します
UUID_SHORT() 整数値のユニバーサル識別子を返します
VALUES() INSERT で使用される値を定義します

  • DEFAULT(col_name)

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

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

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

  • GET_LOCK(str,timeout)

    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_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

  • 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.2.6「範囲外およびオーバーフローの処理」を参照してください。

  • 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::/64192.168.1.0/24 のような末尾のネットワークマスクは許可されません。

    • IPv4 アドレスを表す値では、クラスレスアドレスのみがサポートされます。192.168.1 などのクラスフルアドレスは拒否されます。192.168.1.2:8080 のような末尾のポート番号は許可されません。192.0xa0.1.2 のようなアドレスコンポーネント内の 16 進数は許可されません。8 進数はサポートされていません。192.168.010.1192.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 で追加されました。

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

    この関数は、MySQL 5.6.3 で追加されました。

  • IS_FREE_LOCK(str)

    str という名前が付けられたロックが使用可能であるか (つまり、ロックされていないか) どうかをチェックします。ロックが使用可能である (だれもロックを使用していない) 場合は 1 を返し、使用中である場合は 0 を返し、エラー (不正な引数など) が発生した場合は NULL を返します。

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

  • 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() と同等の強固さです。

    この関数は、MySQL 5.6.3 で追加されました。

  • 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 進表記法を使用して表現することもできます。たとえば、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 で追加されました。

  • 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: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 で追加されました。

  • 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 以外を返します。

    この関数は、MySQL 5.6.3 で追加されました。

  • IS_USED_LOCK(str)

    str という名前が付けられたロックが使用中であるか (つまり、ロックされているか) どうかをチェックします。その場合は、ロックを保持しているクライアントの接続識別子を返します。そうでない場合は、NULL を返します。

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

  • 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_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

  • NAME_CONST(name,value)

    指定された値を返します。結果セットのカラムを生成する際に 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 構文」を参照してください。

  • RELEASE_LOCK(str)

    GET_LOCK() を使用して取得された文字列 str によって名前が付けられたロックを解除します。ロックが解除された場合は 1 を返し、このスレッドによってロックが確立されなかった場合 (その場合、ロックは解除されません) は 0 を返し、名前付きのロックが存在しない場合は NULL を返します。GET_LOCK() を呼び出しても取得されなかった場合や、事前に解除された場合は、ロックが存在しません。

    DO ステートメントは、RELEASE_LOCK() とともに使用すると便利です。セクション13.2.3「DO 構文」を参照してください。

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

  • SLEEP(duration)

    duration 引数で指定された秒数間スリープ状態に (一時停止) してから、0 を返します。SLEEP() が中断された場合は、1 を返します。この期間には、小数部分が含まれている場合もあります。

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

  • UUID()

    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_SHORT()

    (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() は、ステートメントベースのレプリケーションでは正しく動作しません。

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

User Comments
  Posted by Kenn O'Connell on November 3, 2007
As a note to INET_ATON : if you are using (PHP 4, PHP 5) and are looking to get the integer value of an IP address, i have found that the following works flawlessly for converting to and from IPv4 and it's integer equivalent.

$ip = "127.0.0.0"; // as an example

$integer_ip = (substr($ip, 0, 3) > 127) ? ((ip2long($ip) & 0x7FFFFFFF) + 0x80000000) : ip2long($ip);

echo $integer_ip; // integer value
echo long2ip($integer_ip); // dotted format
-----------------------
Results are as follows:
-----------------------
2130706432
127.0.0.0
-----------------------
255.255.255.255 (converts to) 4294967295 (and back to) 255.255.255.255
209.65.0.0 (converts to) 3510697984 (and back to) 209.65.0.0
12.0.0.0 (converts to) 201326592 (and back to) 12.0.0.0
1.0.0.0 (converts to) 16777216 (and back to) 1.0.0.0

While i understand that this is a MySQL comment section, it seems that many have the same issue regarding MySQL / PHP IPv4 address handling in databases, and as such have posted this as a way to help those who, like myself, were frustrated with IP addresses that were not converting properly.
  Posted by Bipul Kuri on March 16, 2012
To get Binary representation of a given IP (dot notation).
where ip='192.168.0.1' is a string
select if(length(CONV(INET_ATON(ip),10,2))<32,LPAD(CONV(INET_ATON(ip),10,2),32,'0'),CONV(INET_ATON(ip),10,2));

so
mysql> SELECT IF(
-> LENGTH( CONV( INET_ATON('192.168.0.1'), 10, 2) ) < 32,
-> LPAD( CONV( INET_ATON('192.168.0.1'), 10, 2), 32, '0'),
-> CONV( INET_ATON('192.168.0.1'), 10, 2)
-> ) as BinaryRep;
+----------------------------------+
| BinaryRep |
+----------------------------------+
| 11000000101010000000000000000001 |
+----------------------------------+
1 row in set (0.00 sec)

  Posted by Nicholas Sherlock on July 21, 2009
You can convert the 36 character string returned by UUID() into a nice compact 16-byte integer to store in a BINARY(16) column. This will give you more compact indexes, and will probably be faster too. Just use:

UNHEX(REPLACE(UUID(),'-',''))

  Posted by Pil Ho Kim on October 1, 2011
In case we want to implement UUID_SHORT using PHP to avoid excessive assess to MySQL when generating UUIDs a lot, below codes will work like MySQL UUID_SHORT. It onces reads two MySQL system variables, then calls uuid_short() as many as you want. This example assume that you implemented your own MySQLGetOneResult that returns the first value of the query.

<php>
$query = "SELECT VARIABLE_VALUE FROM information_schema.SESSION_VARIABLES WHERE VARIABLE_NAME = 'SERVER_ID'";
$mysql_server_id = YourImplementedMySQLGetOneResult($query);

$query = "SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME = 'UPTIME'";
$server_startup_time_in_seconds = time() - intval(YourImplementedMySQLGetOneResult($query));

$uuid_short_count = 0;

function uuid_short() {
return ((($mysql_server_id)&255) << 56) + ($server_startup_time_in_seconds << 24) + $uuid_short_count++;
}
</php>
  Posted by Ben Griffin on March 25, 2013
I'm not really sure that the documentation explains whether the binary column is indexed as a number or as a binarystring. This becomes relevant regarding where the LSB is in UUID fields. Typically with sequences (eg auto-increment) it's the least significant value which changes most frequently, whereas with UUID() I notice that it is the most significant value which changes most frequently. Which generates the most efficient indices?

In the end, I guess I am wondering if it would be more efficient to index the reverse of the UUID when using it in it's binary format, or leave it as it is?

So the options I'm interested in are as follows (assumption is that a primary field of BINARY(16) is populated with the function):

CREATE FUNCTION id() RETURNS binary(16) RETURN unhex(REPLACE(UUID(),'-',''));
or
CREATE FUNCTION id() RETURNS binary(16) RETURN unhex(reverse(REPLACE(UUID(),'-','')));

Measuring appears to indicate that the non-reversed function is much, much faster. But I am not sure why that should be.
  Posted by Shlomi Noach on December 12, 2014
You can make UUID() work with statement based replication through assignment to session variable.

master> set @safe_uuid := UUID();
master> insert into test.uuid_test values (2, @safe_uuid);

-- The above replicates correctly to slaves even with statement based replication.

See: http://code.openark.org/blog/mysql/making-uuid-and-rand-replication-safe

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