2012-03-17 8 views
1

MySql 5.5.19に見つかったバグがあります。MySql UUID duplication BUG

実行する場合:

select uuid(), uuid(); 

あなたが取得している二人は、IDSに等しいです。

テーブルに2つのuuidsを挿入すると2つのバグが発生します。私は常に同じ値を持っています。

誰かがこの2つのバグで動作しますか?キーに2つのuuidが必要な挿入コマンドを実行するにはどうすればよいですか?

編集

実際に私は

c3db913 -705e-11E1-ae17-1c6f6531b785
c3db913を見ることは本当に大変だったので、彼らは一桁が異なる間違ってましたf -705e-11e1-ae17-1c6f6531b785

答えて

6

From the docsUUIDは、時空間で世界的にユニークな番号として設計されています。クエリが実行される前にコンパイルされているため、同じ時刻にUUID()を2回呼び出しています。したがって、両方の値に同じタイムスタンプが使用されるため、同じクエリで2つの一意の値を返すことは期待できません。これは私に意図された行動のように聞こえる。

+4

を助け、私は同じタイムスタンプでそれを一意にするために何ができるか任意のアイデアを願っていますか? –

8

重複した値は得られていませんが、ほぼ同じ値(多分1つの異なる文字)があると強く信じています。 UUIDの最初のブロックはタイムスタンプからミリ秒単位で生成されるため、関数は同じミリ秒単位で実行されます(スーパーコンピュータで実行していますか?)。正直なところ、これはほとんどありません。 実際に重複を取得している場合は、2つのSELECT uuid()クエリを実行し、返された値を使用します。

+0

よくある問題ですが、私はスーパーコンピュータを持っていません。 – Abhishek

0

mysqlはuuid_v1を作成しているので同じ問題に直面しています。別のタイプのuuidを使用する。私は乱数を使ってuuidを生成するuuid_v4を使ってみました。それは完全に正常に動作し、あなたがのuuidに移行した後、あなたはまた戻っuuid_v1に変更することができ、私はそれが

-- Change delimiter so that the function body doesn't end the function 
declaration 
DELIMITER // 

CREATE FUNCTION uuid_v4() 
    RETURNS CHAR(36) 
BEGIN 
    -- Generate 8 2-byte strings that we will combine into a UUIDv4 
    SET @h1 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h2 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h3 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h6 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h7 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h8 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 

    -- 4th section will start with a 4 indicating the version 
    SET @h4 = CONCAT('4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0')); 

    -- 5th section first half-byte can only be 8, 9 A or B 
    SET @h5 = CONCAT(HEX(FLOOR(RAND() * 4 + 8)), 
       LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0')); 

    -- Build the complete UUID 
    RETURN LOWER(CONCAT(
     @h1, @h2, '-', @h3, '-', @h4, '-', @h5, '-', @h6, @h7, @h8 
    )); 
END 
// 
-- Switch back the delimiter 
DELIMITER ; 

The code is taken from here