سؤال

هذه هي أفضل طريقة يمكن أن أتناولها لتحويل MySQL GUID / UUID الناتجة عن UUID () إلى ثنائي (16):

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

ثم تخزينها في ثنائي (16)

هل هناك أي آثار على القيام بذلك بهذه الطريقة التي يجب أن أعرفها؟

هل كانت مفيدة؟

المحلول

ليس الكثير من الآثار. سوف تبطئ الاستعلامات قليلا، لكنك بالكاد تلاحظ ذلك.

UNIQUEIDENTIFIER يتم تخزينه كما 16-byte binary داخليا على أي حال.

إذا كنت ستحميل ثنائي في عميل وتحليله هناك، لاحظ bit order, قد يكون لها تمثيل سلسلة آخر من الأولي NEWID().

OracleSYS_GUID() وظيفة عرضة لهذه المشكلة، تحويلها إلى سلسلة يعطي نتائج مختلفة على العميل وعلى الخادم.

نصائح أخرى

من MySQL 8.0 وما فوق يمكنك استخدام uuid_to_bin.:

uuid_to_bin (string_uuid), ، uuid_to_bin (string_uuid، swap_flag)

يحول سلسلة UIID إلى UUID الثنائي وإرجاع النتيجة. (دالة IS_UUID () الوصف يسرد تنسيقات UUID السلسلة المسموح بها.) The Return Binary 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 يتضمن وظائف MIMCACHED ل MySQL (http://forge.mysql.com/projects/project.php؟id=250.) والتي قد تشمل Murmurhash64a، منذ Memnchached يستخدمها، لكنني لا أعرف. أو إلقاء نظرة على تنفيذ FNV هذا ل MySQL: http://www.xaprb.com/blog/2008/03/09/a-fastery-fast-fnv-hash-function-for-mysql/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top