在节点中将UUID转换为/从二进制转换

时间:2014-09-09 21:00:55

标签: javascript mysql node.js

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

据我所知,UUID基本上是一个16字节的二进制文件,但我不知道如何从/转换成二进制数。

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

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

2 个答案:

答案 0 :(得分:3)

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


是的,如果您的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方法似乎有效。

答案 1 :(得分:2)

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

UUID v1以基于时间的字符段开头;然而,最小的单位首先使分布在指数中分散。

如果您没有坚持精确的UUID v1格式,那么NodeJS模块可以生成基于UUID v1的唯一ID,该模块也会单调增加和缩放以及自动增加的ID。它也适用于node-mysql。

结帐:monotonic-id

node-mysql的一个例子:

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

var mid = new MID();

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