UUID最大字符长度


114

我们将UUID用作oracle数据库的主键,并尝试确定VARCHAR的适当最大字符长度。显然,这是36个字符,但我们注意到生成的UUID比此更长-最多60个字符。有人知道UUID合适的最大字符长度吗?


2
由于UUID是一个128位数字,所以我真的很想知道哪种编码会将其转换为60个字符的字符串。在我看来,编码要么很差,要么是其他未实现的问题。
2012年

1
您的RDBMS是什么?MS SQL具有专用于UUID的类型,其他类型则可以简单地存储字节。您是否出于某些原因要将这些存储为VARCHARs?

@ user565869将其存储为字节对于任何形式的手动检查都是很糟糕的
Enerccio

Answers:


171

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

听起来您需要确定无效的60个字符的ID来自何处,并确定1)是否要接受它们,以及2)这些ID的最大长度可能是多少,取决于用于生成它们的API。


64

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


9
如果您在列上设置的字符是多字节的,则CHAR可能比VARCHAR使用更多的空间(请参阅stackoverflow.com/a/59686/1691446的底部)
David

7
可以肯定的是,UUIDv4仅使用UTF-8的latin-1字符集,在这种情况下不会受到影响。绝对检查您是否正在使用其他字符集。
Aaron_H

2
字符串格式的UUID只能使用以下字符集(正则表达式):,[0-9A-Fa-f-]这是ASCII中的23个不同的八位字节。
考伯特

RFC 4122说UUID是16个八位位组或128位。如果您使用的存储空间不止这些,则编码效率低下。例如,无需对破折号进行编码。他们没有添加任何信息。
特伦顿

4
@Trenton在存储效率和用户友好性之间需要权衡。为了最大程度地提高存储效率,可以将UUID存储为BINARY(16),但是查看DB的人将看不到规范的表示形式,而编程语言只能通过规范/字符串表示形式创建UUID对象,完全具有UUID对象类型;UUID可能以字符串形式存储在文件中,使得与二进制形式的比较繁琐,等等
。– TaylanUB

7

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.