MySql UUID дублирование ошибки

Есть ошибка, которую я нашел в MySql 5.5.19.

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

select uuid(), uuid();

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

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

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

редактировать:

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

c3db9137-705e-11e1-ae17-1c6f6531b785
c3db913f-705e-11e1-ae17-1c6f6531b785

 Shocker18 авг. 2018 г., 10:31
Кстати, подсказка: когда вам нужно сравнить такие длинные строки, самый быстрый способ сделать это - CTRL + C / CTRL + F (опция Find)

Ответы на вопрос(4)

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

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

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

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

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

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

или же

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

2 aviod неявное преобразование, например: набор имен utf8

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

Решение Вопроса

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

 Ilya Gazman17 мар. 2012 г., 15:09
Любые идеи, что я могу сделать, чтобы сделать его уникальным в то же время?

так как 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 ;

Код взят отсюда

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

 Rimas Kudelis17 авг. 2018 г., 21:07
Суперкомпьютер - это немного преувеличение. У меня был довольно легко воспроизводимый случай, когда MySQL генерировал дубликаты UUID для поля первичного ключа во время генерации и загрузки приборов на ноутбуке модели 2015 года.
 Abhishek14 мар. 2017 г., 13:23
Это общая проблема, у меня нет супер компьютеров.

Ваш ответ на вопрос