ChatGPT解决这个技术问题 Extra ChatGPT

UUID 最大字符长度

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

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

C
Community

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

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


R
RiggsFolly

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


如果列上的字符集是多字节的,则 CHAR 可能比 VARCHAR 使用更多空间(参见 stackoverflow.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 可能以字符串形式存储在文件中,与二进制形式进行比较很麻烦等。
S
StephenS

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