2012-03-17 1 views
1

MySql 5.5.19에서 발견 된 버그가 있습니다.MySql UUID duplicate BUG

실행할 때 :

select uuid(), uuid(); 

당신은 점점 두 개의 ID를 동일합니다.

필자는 두 개의 uuids를 테이블에 삽입 할 때이 버그를 두 번 실행합니다. 항상 동일한 값을가집니다.

다른 사람이이 버그를 두 번 실행합니까? 내 키에 두 개의 uuids가 필요한 삽입 명령을 어떻게 수행 할 수 있습니까?

편집 :

사실 나는

c3db913 7 -705e-11e1-ae17-1c6f6531b785
c3db913을보고 정말 열심히했다, 그래서 그들이 한 자리에 다른 잘못된 있어요 f -705e-11e1-ae17-1c6f6531b785

답변

6

From the docsUUID는시와 공간에서 전 세계적으로 고유 한 숫자로 설계되었습니다. 쿼리가 실행되기 전에 컴파일되므로 동일한 시간에 UUID()을 두 번 호출합니다. 따라서 동일한 시간 소인이 두 값에 모두 사용되므로 동일한 조회에서 두 개의 고유 한 값을 리턴 할 것으로 기대할 수 없습니다. 이것은 나에게 의도 된 행동처럼 들린다.

+4

내가 같은 타임 스탬프에 고유하게 만들기 위해 할 수있는 모든 아이디어를 도움이되기를 바랍니다? –

8

필자는 중복 된 값을 얻지는 않을 것이라고 강력히 믿지만, 거의 동일한 값 (아마도 1 개의 다른 문자)을 사용한다고 믿는다. UUID의 첫 번째 블록이 밀리 초 단위의 타임 스탬프에서 생성되므로 함수가 동일한 밀리 초 단위로 실행된다는 것을 의미합니다 (실제로 슈퍼 컴퓨터에서 실행 중입니까?). 솔직히 말해서 거의 불가능합니다. 정말로 중복되는 경우 두 개의 SELECT uuid() 쿼리를 실행하고 원하는 쿼리에서 반환 된 값을 사용하십시오.

+0

일반적인 문제는 슈퍼 컴퓨터가 없습니다. – Abhishek

0

mysql이 uuid_v1을 생성하므로 많은 문제가되지 않지만 동일한 문제가 발생했습니다. 다른 유형의 uuid를 사용합니다. 나는 uuid_v4을 사용하여 임의의 숫자를 사용하여 uuid를 생성 해 보았습니다. 그것은 완벽하게 잘 작동하고 당신은 또한 당신이 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