MySQL:使用带有自动增量的整数作为主键 - 我应该将其声明为无符号吗?

时间:2014-04-11 21:35:04

标签: mysql sql integer unsigned unsigned-integer

创建表格时,我经常使用INTEGERAUTO_INCREMENT作为主键(代理键),如下所示:

CREATE TABLE 'my_table' (
    user_id INTEGER AUTO_INCREMENT PRIMARY KEY,
    […]
);

(请注意,省略号仅用于重点关注重要事项。)

现在我已经读过INTEGER列可以保存从-2,147,483,648到2,147,483,647的整数,以及无符号时从0到4,294,967,295的整数。

由于user_id将始终是无符号的(如果我没有记错,MySQL将从0开始计数),将此列明确标记为UNSIGNED以允许更多用户存储在该表中是否有意义( 4,294,967,295而不是2,147,483,647)?

2 个答案:

答案 0 :(得分:1)

无符号可以根据该字段改进您的查询。

除此之外,没有真正的区别

请参阅此链接中的文章>> Signed vs Unsigned了解有关为何查询速度更快的更多信息。


假设以下查询,其中'quantity'是INT字段。

SELECT *
FROM customer
WHERE quantity <= 500 

如果quantity 不是无符号,那么数量字段是“int”并且您有此字段的索引,MySQL会将范围定义为-2147483648到500并且它将根据此范围得到结果。

但是,如果quantity字段 IS 无符号,那么该范围将为0 - 500.范围要小得多。


此处适用的唯一其他约定是实际存储信息。无符号,因为它的基数为0-4m,因为二进制计数更高,需要更多存储空间。签名时,如果是正数或负数,则为0-2m,标记为1位。这样可以减少存储需求。

概要

如果您想节省空间,请使用Signed。 如果您想要速度,请使用Unsigned

答案 1 :(得分:1)

根据http://dev.mysql.com/doc/refman/5.0/en/integer-types.html,UNSIGNED INT的大小和签名的INT,因此不会对您的选择产生影响。据我所知,AUTO_INCREMENT从1开始,所以如果您认为需要超过2,147,483,647行,请选择unsigned int。