MySql UUID дублирование ошибки - PullRequest
1 голос
/ 17 марта 2012

Я обнаружил ошибку в MySql 5.5.19.

При выполнении:

select uuid(), uuid();

Вы получаете два идентичных идентификатора.

Я запускаю в два раза эту ошибку, когда вставляю два uuids в мою таблицу, я всегда получаю одни и те же значения.Как я могу выполнить команду вставки, которая требует двух uuids для моих ключей?

Edit :

На самом деле я ошибся, они отличаются в одной цифре, так что было действительно трудносм.

c3db913 7 -705e-11e1-ae17-1c6f6531b785
c3db913 f -705e-11e1-ae17-1c6f6531b785

1025*

Ответы [ 4 ]

9 голосов
/ 17 марта 2012

Я твердо верю, что вы получаете не дублирующиеся значения, а некоторые почти идентичные значения (возможно, 1 другой символ).Из-за того, что первый блок UUID генерируется из отметки времени в миллисекундах, это будет означать, что функции выполняются за одну и ту же миллисекунду (вы запускаете его на суперкомпьютере?), Что, честно говоря, весьма маловероятно.Если вы действительно получаете дубликаты, запустите два отдельных запроса SELECT uuid () и используйте возвращенные значения в желаемом запросе

7 голосов
/ 17 марта 2012

Из документов UUID представляет собой число, глобально уникальное в пространстве и времени. Поскольку запрос компилируется перед выполнением, вы вызываете UUID() дважды в тот же момент времени. Следовательно, нельзя ожидать, что он выдаст два уникальных значения в одном запросе, поскольку для обоих значений будет использоваться одна и та же временная метка. Для меня это звучит как намеченное поведение.

2 голосов
/ 18 июля 2018

Это не ошибка функции uuid ()

Неожиданный результат получился, потому что неявное преобразование произошло, когда ваш клиент charset и результат charset не utf8;

1 Вывод uuid () - utf8, независимо от того, какая у вас кодировка;

2, когда ваш клиент charset и результат charset имеют более высокий приоритет, чем utf8, такой как utf8mb4, тогда происходит неявное преобразование, другие кодировки с более низким приоритетом, такие как latin1, работают нормально;

3 Неявное преобразование превратит uuid () в постоянную строку перед выполнением sql, поэтому после завершения выполнения sql тот же uuid () вернет

вы можете увидеть все эти события, используя объяснение extended + ваше предложение, а затем используя show warnings;

как решить? 1 поворот неявного преобразования в явное преобразование например : установить имена utf8mb4; заменить (преобразовать (uuid (), используя utf8mb4), '-', '')

или

установить имена utf8mb4; заменить (uuid (), _ utf8 '-', _ utf8 '')

2 aviod неявное преобразование например: установить имена utf8

введите описание ссылки здесь

0 голосов
/ 15 июля 2017

Я столкнулся с той же проблемой, так как mysql создает uuid_v1 , и делать нечего, кроме как использовать другой тип uuid.Я попытался использовать uuid_v4 , который генерирует uuid с использованием случайных чисел.Он прекрасно работает, и вы также можете перейти на uuid_v1 после перехода на uuid, надеюсь, это поможет

-- 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 ;

Код взят здесь

...