什么时候应该在MySQL中使用UNSIGNED和SIGNED INT?
使用哪种更好,或者这只是个人偏爱?
因为我看过它像这样使用;
和
负PK没有太大意义
MySQL中" unsigned"是什么意思以及何时使用它的可能重复项?
UNSIGNED仅存储正数(或零)。另一方面,带符号的可以存储负数(即可以带负号)。
这是每个INTEGER类型可以存储的值范围的表:
资料来源:http://dev.mysql.com/doc/refman/5.6/en/integer-types.html
UNSIGNED的范围从0到n,而有符号的范围从-n/2到n/2。
在这种情况下,您有一个AUTO_INCREMENT ID列,因此您没有负数。因此,使用UNSIGNED。如果在AUTO_INCREMENT列中不使用UNSIGNED,则最大可能值将是最大值的一半(并且值范围的负一半将不使用)。
但是请注意,UNSIGNED是MySQL特定的,而不是标准的SQL功能。 这意味着使用UNSIGNED可能会使将来迁移到其他RDBMS变得更加复杂,或者在使用针对标准SQL的软件库(例如SQLAlchemy)时给您带来麻烦。 我认为这应该是答案的一部分。
将UNSIGNED用于非负整数。
基本上使用UNSIGNED,您将为整数提供两倍的空间,因为您明确指定不需要负数(通常是因为存储的值永远不会为负数)。
我不同意vipin cp。
确实,第一位用于表示符号。但是1代表负值,0代表正值。超过负值的编码方式不同(二进制补码)。 TINYINT的示例:
The sign bit
|
1000 0000b = -128d
...
1111 1101b = -3d
1111 1110b = -2d
1111 1111b = -1d
0000 0000b = 0d
0000 0001b = 1d
0000 0010b = 2d
...
0111 1111b = 127d
如果您知道要存储的数字类型,则可以进行相应选择。
在这种情况下,您的" id"永远不能为负。因此,您可以使用unsigned int。
有符号整数的范围:-n / 2至+ n / 2
无符号整数的范围:0到n
因此,您可以使用正数的两倍。
相应地选择。
我想补充一件事
在signed int(即default value in mysql)中,1 bit将用于表示sign。 -1 for negative and 0 for positive.
因此,如果您的应用程序仅插入正值,则最好指定无符号。
我认为,UNSIGNED将是最好的选择,以分钟,小时或秒的格式存储time_duration(例如:resolved_call_time = resolved_time(DateTime)-creation_time(DateTime))值,这肯定是一个非负数