UUID最大字符长度

use*_*862 106 uuid primary-key

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

bro*_*ofa 158

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

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


apo*_*tek 61

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

  • 如果列上的字符集是多字节的,则CHAR可能会使用比VARCHAR更多的空间(请参阅http://stackoverflow.com/a/59686/1691446上的底部部分) (9认同)
  • 很确定UUIDv4只使用UTF-8的latin-1字符集,在这种情况下,这不会受到影响.绝对检查你是否使用不同的字符集. (6认同)
  • RFC 4122 规定 UUID 是 16 个八位字节或 128 位。如果您使用的存储空间超过了那么多,那么您对它们的编码效率就会很低。例如,无需对破折号进行编码。他们没有添加任何信息。 (3认同)
  • @Trenton在存储效率和用户友好性之间进行权衡.可以将UUID存储为BINARY(16)以获得最大的存储效率,但是查看数据库的人不会看到规范表示,并且编程语言可能只有从规范/字符串表示创建UUID对象的方法,或者不能完全具有UUID对象类型; UUID可能以字符串形式存储在文件中,与二进制形式比较繁琐,等等. (3认同)
  • 字符串格式的UUID只能使用这组字符(正则表达式):`[0-9A-Fa-f-]`,这是ASCII中23个不同的八位字节. (2认同)
  • @julaine _specific_ 字符集已被弃用(3字节UTF-8),因为通常在使用UTF-8时您应该使用4字节变体。CHAR 列的大小是固定的,将占用其可容纳的最大数据长度所需的完整大小。如果您使用多字节字符集,这意味着您可能使用 2 到 4 倍的所需空间。示例:使用 1 字节字符集,最多 36 个字符。消耗36字节。CHAR(36) 在这里是最好的。如果使用 4 字节字符集,则 CHAR(36) 列将使用 36x4 字节(144 字节)。VARCHAR(36) 将使用 38 个字节(在有效 UUID 的情况下)。 (2认同)

Ste*_*enS 6

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

  • @COMMANDERCAPSLOCK 为了公平对待其他选民,我迟到了 6 年才回答。 (3认同)