在 Node 中将 UUID 与二进制相互转换

问题描述 投票:0回答:3

我从事的项目切换到MySQL。我们使用的键是 UUID 字符串(如 43d597d7-2323-325a-90fc-21fa5947b9f3),但数据库字段不是字符串,而是定义为 binary(16) - 16 字节无符号二进制。

我知道 UUID 基本上是一个 16 字节二进制,但我不知道如何与二进制数进行转换。

我使用 node-mysql 访问数据库,并尝试使用 node-uuid 解析 UUID,但这会产生一个整数数组。我还尝试使用 Node 的 Buffer,但这只会产生一个缓冲区对象。

如何转换 UUID 字符串以适合该字段?如何将从该字段读取的值转换为 UUID?

javascript mysql node.js
3个回答
6
投票

由于时间不够,我将粘贴提供有效结果的评论,并稍后修改答案,以便更清晰。


正确,如果您的 JS 应用程序中已有该字符串格式的

UUID 43d597d7-2323-325a-90fc-21fa5947b9f3
,您可以将以下查询发送到 MySQL:


SELECT col FROM table WHERE uuid_col = UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''));

如果你想取出数据并拥有可读格式的UUID,你必须将其转换为十六进制表示法。


SELECT HEX(uuid_col) FROM table;

那个将为您提供不带破折号的 UUID。如果您提供不带破折号的十六进制字符串,则

node-uuid.parse
方法似乎可以工作。


3
投票

虽然 N.B. 的答案有效,但我偶然发现了另一个解决方案。

UUID v1 以基于时间的字符段开始;然而,最小的单位首先出现,使得索引中的分布相当分散。

如果您不拘泥于精确的 UUID v1 格式,那么有一个 NodeJS 模块可以根据 UUID v1 生成唯一的 ID,这些 ID 也可以单调增加和缩放以及自动递增 ID。它也适用于node-mysql。

结帐:单调ID

node-mysql 的示例:

var MID = require('monotonic-id');

var mid = new MID();

client.query('INSERT INTO `...` SET `mid`=?', mid.toBuffer(), function(err, res) {
   ...
})

0
投票

要将 UUID 字符串表示为字节,您可以使用 parse()

 模块中的 
uuid

const uuid = require("uuid");

uuid.parse("55c0bd9e-d18a-446b-aa1d-4f6c3c3ce58f");

// -- Result --
Uint8Array(16) [
   85, 192, 189, 158, 209,
  138,  68, 107, 170,  29,
   79, 108,  60,  60, 229,
  143
]
© www.soinside.com 2019 - 2024. All rights reserved.