UUID的最大字符长度

164

我们在Oracle数据库中使用UUID作为主键,并尝试确定适当的VARCHAR最大字符长度。 显然,这是36个字符,但我们注意到生成的UUID的长度超过了这个值 - 长度长达60个字符。 有人知道UUID的合适最大字符长度吗?


3
作为UUID是一个128位数字,我非常好奇看到什么编码可以将其转换为60个字符的字符串。在我看来,这似乎是极差的编码,或者是其他不相关的问题。 - fvu
2
你使用的关系型数据库是什么?MS SQL有专门用于UUID的数据类型,其他数据库可以简单地存储字节。你是否有存储这些UUID为VARCHAR的原因? - user565869
@user565869 将它们存储为字节对于任何手动检查都是可怕的。 - Enerccio
4个回答

227

RFC4122第3节提供了UUID字符串表示的正式定义。它由36个字符组成(32个十六进制数字和4个破折号)。

听起来好像你需要找出这些无效的60个字符的ID来自哪里,并决定 1)是否要接受它们,以及 2)根据生成它们的任何API确定这些ID的最大长度。


87

顺便提一下,如果每个值的长度都相同的话,CHAR 36 就是定义这种字段的完美类型,而不是VARCHAR 36。并且你会使用更少的存储空间,因为你不需要为每个值存储数据长度,只需要存储值本身即可。


11
如果列的字符集是多字节的(参见 https://dev59.com/63VD5IYBdhLWcg3wL4cA#59686 底部),CHAR 在使用时可能比 VARCHAR 占用更多的空间。 - David
9
很确定UUIDv4仅使用UTF-8的Latin-1字符集,因此这不会受到影响。但一定要检查是否使用了不同的字符集。 - Aaron_H
2
UUID在字符串格式中只能使用这组字符(正则表达式):[0-9A-Fa-f-],这是ASCII中23个不同的八位字节。 - cowbert
2
RFC 4122规定UUID是16个八位组或128位。如果您使用的存储空间超过此限制,则编码效率低下。例如,没有必要对破折号进行编码,因为它们不添加任何信息。 - Trenton
11
@Trenton,存储效率和用户友好性之间需要权衡。为了最大化存储效率,可以将UUID存储为BINARY(16),但是查看数据库的人将无法看到规范表示,并且编程语言可能只能从规范/字符串表示中创建UUID对象,或者根本没有UUID对象类型; UUID可能以字符串形式存储在文件中,使用二进制形式进行比较会很麻烦,等等。 - TaylanKammer
显示剩余3条评论

23

现在大多数数据库都有原生的UUID类型,以便更容易地使用它们。如果你的数据库没有这种类型,那么UUID只是128位数字,因此你可以使用BINARY(16)。如果你经常需要文本格式来进行故障排除等操作,则可以添加一个计算列来自动从二进制列生成它。没有什么好的理由去存储(更大的)文本形式。


你的赞数最少,这太荒谬了。这应该是问题的正确答案。 - COMMANDER CAPSLOCK
2
@COMMANDERCAPSLOCK 为了公平起见,我六年后回答了这个问题。 - StephenS

0
我知道这个问题已经很多年了,但现在使用Oracle,他们确实有一个UUID数据类型可以使用。从他们的网站上可以看到:
“通用唯一标识符(UUID)是一个128位的数字,用于在计算机系统中标识信息。您可以创建一个UUID并将其用于唯一标识某些内容。在其规范的文本表示中,UUID的16个八位字节以32个十六进制(基数16)数字表示,以五组由连字符分隔的形式显示,总共36个字符(32个十六进制字符和4个连字符)。例如,a81bc81b-dead-4e5d-abff-90865d1e13b1。”
所以如上所述,您可以使用UUID类型或使用长度为36的字符字符串。
你可以在这里查看有关UUID数据类型的更多信息:Oracle https://docs.oracle.com/en/database/other-databases/nosql-database/21.1/sqlreferencefornosql/using-uuid-data-type.html#GUID-D2BEE2A1-BF6D-4F4A-8EF4-059A6C8FBAA6 以下是支持UUID的其他数据库列表。

MySQL https://blogs.oracle.com/mysql/post/mysql-uuids https://dev.mysql.com/blog-archive/storing-uuid-values-in-mysql-tables/

Microsoft SQL https://learn.microsoft.com/zh-cn/sql/t-sql/data-types/uniqueidentifier-transact-sql?view=sql-server-ver16

Postgres https://www.postgresql.org/docs/current/datatype-uuid.html

MongoDB https://www.mongodb.com/docs/manual/reference/method/UUID/


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