2011-01-12 100 views
2

我的数据库中的大多数表都具有类型为varchar的数据,并将长度设置为36,用于填充本机创建的GUID。 varchar是最合适的数据类型来存储guid值或mysql中的任何其他类型? PLZ解释mysql数据类型

+3

请问你的GUID是什么样子? – Tobias 2011-01-12 14:55:35

回答

1

这是一个很好的问题。我在很多地方看到,他们使用varchar来表示不同类型的ID,看起来像数字。那么为什么不使用整数?嗯,根据我的经验,主要有三种情况:

  1. 虽然他们是数量,他们可能会过大。例如,对于32位数的数字(64位无符号整数的最大值为20位),您将无法使用整数(即使是64位大整数)。

  2. 某些数字有特殊的格式。例如,电话号码可能如下所示:+44(12)3456789。现在显然,+,(和)不是数字的一部分,您可以在没有它们的情况下调用该数字,但这是通常的格式,所以对于整数变量,您将无法存储该数字。

  3. 在未来你可能会改变你的ID,包括字母,所以这是一个很好的做法,允许从一开始的信件,以避免以后改变数百万条记录。

希望有所帮助。

2

您可能想查看PROCEDURE ANALYSE。它可以帮助根据表中已经存在的内容建议适当的数据类型。

这里是一个blog post也谈到PROCEDURE分析和可能会有所帮助。

0

我的意思是,VARCHAR允许要使用的每个字符,并且通常由像数数据类型溢出防止。所以......好吧,如果你希望你的GUID在数字字符之外包含大的值或值,那么你就是金。

1

如果您的GUID总是长度为36且不为空,请使用CHAR而不是VARCHAR。它将节省空间,因为VARCHAR必须为每一行存储一个长度前缀。

另外,如果您的所有列的长度固定,它会因为数据库能更高效地扫描行增加在某些情况下的性能。

MySQL Reference Manual - The CHAR and VARCHAR Types

1

这一切都取决于你的意思是“最合适”的。

varchar(36)的优点是简单。您可以按原样存储GUID,并轻松将其读回。

但是,如果你担心的磁盘空间量,列占用,那么你有几个选择:

VARCHAR(36)= 37个字节 CHAR(36)= 36个字节 CHAR( 32)= 32字节(只是删除连字符) 二进制(16)= 16字节(删除连字符和unhex GUID以获得二进制字符串)

所以,如果你担心磁盘空间,你会发现二进制(16)比varchar(36)好得多。

这里是在MySQL得到一个二进制(16)字符串从一个GUID的一个例子:

unhex(replace(uuid(),'-',''))