Mysql中用于替代uniqueidentifier的是什么?

20

我有一个从SQL Server获取的查询语句,我想在MySQL中运行它。但是我无法找到任何替代SQL Server脚本中的uniqueidentifier关键字的方法。

这是查询语句:

 CREATE TABLE foo(
  myid uniqueidentifier NOT NULL,
  barid uniqueidentifier NOT NULL
)
MySQL查询与上述SQL Server脚本相同的内容是什么?
4个回答

23
CREATE TABLE FOO (
myid CHAR(38) NOT NULL,
barid CHAR(38) NOT NULL
);
根据微软网站的说法,GUID的长度为38个字符。

1
UUID是什么?它是相同的吗,还是我们需要使用UUID函数来完成? - jimmy
1
UUID 是 MySQL 的一个函数,它返回 GUID - 它不会对存储做任何操作。指定 myid CHAR(38) NOT NULL 是创建一个名为 myid 的列,并且它的类型是长度恰好为 38 个字符的 CHAR 类型的语句。由于 GUID 实际上被表示为一个 38 字节的字符串,因此您需要将其存储为这样的字符串。这就是为什么在 MySQL 中没有“快捷方式”,您需要显式设置列数据类型,然后可以调用内部函数,将结果存储在新创建的表中。 - N.B.
1
好的,明白了。非常感谢。ROWGUIDCOL 的工作方式也一样吗? - jimmy
1
如果ROWGUIDCOL存储与GUID相关的任何内容,那么它肯定会被表示为字符串,因此在MySQL中,您将其保存为CHAR(如果长度固定)或VARCHAR(如果长度可变)。 - N.B.
非常感谢您的帮助,非常感激。 - jimmy

21

虽然已经有一个被接受的回答,但它并不完全是错误的,只是有些不完整。当然,确实存在更空间有效的方法来存储 GUID/UUID。请查看这个问题:"Storing MySQL GUID/UUIDs"

这是我想到的将由 UUID() 生成的 MySQL GUID/UUID 转换为 binary(16) 的最佳方式:

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

如果存储GUID/UUID的空间是主要考虑因素,那么这种方法将节省大量空间。

然后将其存储在二进制(16)中。


5

2

还需要记住的是,16个字节的值在十六进制中表示为32个字节。加上4个破折号和2个花括号,这样我们就得到了这种格式的38个字节,该格式与SQL Server兼容并生成了一个38字节的字符串。例如:{2DCBF868-56D7-4BED-B0F8-84555B4AD691}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接