UUID 最大字符长度

Posted

技术标签:

【中文标题】UUID 最大字符长度【英文标题】:UUID max character length 【发布时间】:2012-11-15 11:54:39 【问题描述】:

我们使用 UUID 作为 out oracle DB 的主键,并尝试确定 VARCHAR 的适当最大字符长度。显然这是 36 个字符,但我们注意到生成的 UUID 比这更长 - 最多 60 个字符。 有谁知道适合 UUID 的最大字符长度??

【问题讨论】:

由于 UUID 是一个 128 位的数字,我真的很想知道什么编码会将其转换为 60 字符的字符串。在我看来,要么是编码极差,要么是其他一些未知的问题。 你的关系型数据库是什么? MS SQL 有一个专用的 UUID 类型,其他的可以简单地存储字节。您是否有某些原因要将这些存储为VARCHARs? @user565869 将它们存储为字节对于任何类型的手动检查都很糟糕 【参考方案1】:

Section 3 of RFC4122 提供了 UUID 字符串表示的正式定义。它是 36 个字符(32 个十六进制数字 + 4 个破折号)。

听起来您需要弄清楚无效的 60 字符 ID 的来源并决定 1) 是否要接受它们,以及 2) 这些 ID 的最大长度可能基于任何 API 用于生成它们。

【讨论】:

【参考方案2】:

顺便说一句,这是定义为 CHAR 36 的完美字段,而不是 VARCHAR 36,因为每个值都具有完全相同的长度。而且您将使用更少的存储空间,因为您不需要存储每个值的数据长度,只需存储值。

【讨论】:

如果列上的字符集是多字节的,CHAR 可能比 VARCHAR 使用更多的空间(请参阅***.com/a/59686/1691446 的底部) 很确定 UUIDv4 仅使用 UTF-8 的 latin-1 字符集,在这种情况下不会受到影响。一定要检查你是否使用了不同的字符集。 字符串格式的 UUID 只能使用这组字符(正则表达式):[0-9A-Fa-f-],这是 ASCII 中的 23 个不同的八位字节。 RFC 4122 说 UUID 是 16 个八位字节或 128 位。如果您使用的存储空间超过了那么多,那么您对它们的编码效率就很低。例如,无需对破折号进行编码。他们不添加任何信息。 @Trenton 在存储效率和用户友好性之间需要权衡取舍。可以将 UUID 存储为 BINARY(16) 以获得最大的存储效率,但是查看数据库的人不会看到规范表示,并且编程语言可能只有一种从规范/字符串表示创建 UUID 对象的方法,或者没有完全有 UUID 对象类型; UUID 可能以字符串形式存储在文件中,与二进制形式比较麻烦等。【参考方案3】:

如今,大多数数据库都有本机 UUID 类型,以便更轻松地使用它们。如果你没有,它们只是 128 位数字,所以你可以使用 BINARY(16),如果你经常需要文本格式,例如为了进行故障排除,然后添加一个计算列以从二进制列自动生成它。没有充分的理由存储(大得多的)文本表单。

【讨论】:

以上是关于UUID 最大字符长度的主要内容,如果未能解决你的问题,请参考以下文章

SQL的语句最大长度限制多少字符

ORACLE的数据类型的长度合集

MySQL uuid()函数生成的UUID的长度问题

GET/POST 请求参数长度的最大值

#计算回文字符串最大长度模板题

UUID长度固定怎么保证不重复