创建表时,我经常使用以AUTO_INCREMENT
为主键(代理键)的INTEGER
列,如下所示:
CREATE TABLE 'my_table' (
user_id INTEGER AUTO_INCREMENT PRIMARY KEY,
[…]
);
(请注意,省略号只是为了将示例集中在重要内容上。)
现在我已经读到了INTEGER
列可以在无符号时包含-2147483648到2147483647以及0到4294967295的整数。
由于user_id
将始终是无符号的(如果我没有记错的话,MySQL从0开始计数),因此将此列显式标记为UNSIGNED
以允许更多用户存储在该表中(4294967295而不是2147483647)有意义吗?
根据http://dev.mysql.com/doc/refman/5.0/en/integer-types.html,未签名INT和签名INT的大小,所以这不会对您的选择产生影响。据我所知,AUTO_INCREMENT从1开始,所以如果您认为需要超过2147483647行,请选择无符号整数。
Unsigned允许改进基于该字段的查询。
除此之外,并没有真正的区别
请参阅此链接上的文章>>已签名与未签名,了解为什么查询速度更快的更多信息。
假设以下查询,其中"quantity"是INT字段。
SELECT *
FROM customer
WHERE quantity <= 500
如果quantity
不是无符号的,那么quantity字段是一个"int",并且您有该字段的索引,MySQL将定义范围为-2147483648到500,并根据该范围获得结果。
但是,如果quantity
字段IS无符号,则该范围将为0-500。一个小得多的范围。
这里唯一适用的其他约定是信息的实际存储。无符号,因为它的基数是0-4m,二进制计数越高,需要更多的存储空间。其中带符号的是0-2m,如果它是正的或负的,则有1位要标记。这样可以减少存储需求。
摘要
如果您想节省空间,请使用Signed
。如果需要速度,请使用Unsigned
。