Вопрос

Это лучший способ преобразовать MySQL GUID/UUID, сгенерированный UUID(), в двоичный файл (16):

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

А затем сохранить его в BINARY(16)

Есть ли какие-либо последствия такого поведения, о которых мне следует знать?

Это было полезно?

Решение

Не так много последствий.Это немного замедлит выполнение запросов, но вы этого почти не заметите.

UNIQUEIDENTIFIER хранится как 16-byte binary во всяком случае внутри.

Если вы собираетесь загрузить двоичный файл в клиент и проанализировать его там, обратите внимание на bit order, он может иметь другое строковое представление, чем исходное NEWID().

Oracle's SYS_GUID() функция склонна к этой проблеме, преобразование ее в строку дает разные результаты на клиенте и на сервере.

Другие советы

Из MySQL 8.0 и выше вы можете использовать UUID_TO_BIN:

UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuid, swap_flag)

Преобразует строковый UUID в двоичный UUID и возвращает результат.(В описании функции IS_UUID() перечислены разрешенные форматы строковых UUID.) Возвращаемый двоичный UUID представляет собой значение VARBINARY(16).

CREATE TABLE t (id binary(16) PRIMARY KEY);

INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));

SELECT *, BIN_TO_UUID(id) FROM t;

Демо-версия DB-Fiddle.com

Я бы хэшировал его в 8-байтовое целое число и сохранил его, используя высокоэффективный односторонний алгоритм хеширования с низким уровнем коллизий, такой как MurmurHash64A.Это занимает намного меньше места и может быть проиндексировано и/или разделено.Существует проект SourceForge, который включает функции MemCached для MySQL (http://forge.mysql.com/projects/project.php?id=250), который может включать MurmurHash64A, поскольку его использует Memchached, но я не знаю.Или посмотрите на эту реализацию FNV для MySQL: http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top