我从事的项目切换到MySQL。我们使用的键是 UUID 字符串(如 43d597d7-2323-325a-90fc-21fa5947b9f3),但数据库字段不是字符串,而是定义为 binary(16) - 16 字节无符号二进制。
我知道 UUID 基本上是一个 16 字节二进制,但我不知道如何与二进制数进行转换。
我使用 node-mysql 访问数据库,并尝试使用 node-uuid 解析 UUID,但这会产生一个整数数组。我还尝试使用 Node 的 Buffer,但这只会产生一个缓冲区对象。
如何转换 UUID 字符串以适合该字段?如何将从该字段读取的值转换为 UUID?
由于时间不够,我将粘贴提供有效结果的评论,并稍后修改答案,以便更清晰。
正确,如果您的 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
方法似乎可以工作。
虽然 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) {
...
})