什么时候应该在MySQL中使用UNSIGNED和SIGNED INT?


100

什么时候应该在MySQL中使用UNSIGNED和SIGNED INT?使用哪种更好,或者这只是个人偏爱?因为我已经看到它像这样使用;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

id INT(11) NOT NULL AUTO_INCREMENT

4
否定PK的意义不大
zerkms 2012年

Answers:


163

UNSIGNED仅存储正数(或零)。另一方面,带符号可以存储负数(即,可以带负)。

这是每种INTEGER类型可以存储的值范围的表:

MySQL INTEGER类型和长度
资料来源:http : //dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNED范围从0n,而有符号范围从-n/2n/2

在这种情况下,您有一个AUTO_INCREMENTID列,因此不会有否定的内容。因此,请使用UNSIGNED。如果您不使用UNSIGNEDAUTO_INCREMENT列,则最大可能值将是该值的一半(并且该值范围的负一半将不使用)。


14
但是请注意,这UNSIGNED是特定于MySQL的,不是标准的SQL功能。这意味着,使用UNSIGNED面向标准SQL的软件库(例如SQLAlchemy)时,使用可能会使将来向其他RDBMS的迁移更加复杂或给您带来麻烦。我认为这应该是答案的一部分。
minexew 18/09/14


4

基本上使用UNSIGNED,您将为整数留出两倍的空间,因为您明确指定不需要负数(通常是因为存储的值永远不会为负数)。


1

我不同意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  


0

我要在中添加的一件事signed int,即default value in mysql1 bit将用于表示sign-1 for negative and 0 for positive. 因此,如果您的应用程序仅插入正值,则最好指定无符号。


0

如果您知道要存储的数字类型,则可以进行相应选择。在这种情况下,您的“ id”永远不能为负。因此,您可以使用unsigned int。有符号整数的范围:-n / 2到+ n / 2无符号整数的范围:0到n因此,您可以使用的正数是其两倍。相应地选择。


0

我认为,以分钟,小时或秒的格式UNSIGNED存储time_duration(Eg:)resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)值之类的东西将是最好的选择,这肯定是一个非负数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.