Хранение GUID/UUID MySQL
Вопрос
Это лучший способ преобразовать 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;
Я бы хэшировал его в 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/