2015-10-14 62 views
1

好了,我知道在MySQL INT类型具有范围的任0至4294967295或-2,147,483,648到2,147,483,647 MySQL reference在这种情况下,MySQL INT列的实际范围是多少?

我的问题是,如果我有在INT列中的单个行的值-1,其他所有行都是正数,该列的实际范围是多少?由于它有一个负数,列是否自动具有-2,147,483,648到2,147,483,647的范围,或者范围更具动态性,取而代之的是-1到4,294,967,294?

+0

容易测试插入第一4294967294,然后用2,147,483,648更新同一单元格值。然后将您的列更改为'INT UNSIGNED DEFAULT 1',然后重试。然后你会看到它的动态,除非你指定。 – HRgiger

+0

也不要担心downvote想知道总是很好 – HRgiger

+0

谢谢!当我投入大量精力来遵守发布规则时,我在最初的低调中感到有些恼火。但我想这就是有时会发生的事情。 – arcademonkey

回答

1

您在MySQL参考中看到的范围描述了是否在SIGNED(缺省为空)或UNSIGNED作为列定义中的属性添加。例如,CREATE TABLE my_table(column_1 INT UNSIGNED...)

如果指定UNSIGNED,则扩展数据类型的上限(假定相关数据类型具有SIGNED/UNSIGNED选项),但是也会丢失范围的下限。如果您指定SIGNED或者根本不指定任何内容(那么将应用默认的SIGNED),那么您的上限是SIGNED范围的上限。

因此,对于INT类型的SIGNED列(或如果没有指定属性),你的范围是2,147,483,648到2,147,483,647。如果你指定UNSIGNED,你的范围是0到4,294,967,295,而你实际上不能将-1放在该列中,并将它正确地存储为-1。根据http://dev.mysql.com/doc/refman/5.1/en/out-of-range-and-overflow.html,MySQL“存储表示该范围的相应端点的值”用于整数。因此,将-1插入UNSIGNED整数列将存储0。如果您需要存储负整数值,则需要使用SIGNED。如果您需要扩展的高范围,并且不需要存储负数,则可能需要使用UNSIGNED属性。

0

0到4,294,967,295的范围是UNSIGNED。举个例子:

... 
`type` int(10) UNSIGNED NOT NULL DEFAULT '0' 
... 

您必须专门设置否则认为是签署该列的签名状态,这将有-2,147,483,648至2,147,483,647

2

所以更具体有关INT数据类型;你可以有INT UNSIGNEDINT SIGNED。这是在创建列时设置的。如果您没有指定,我相信它默认为SIGNED。因此,任何INT列可以是SIGNEDUNSIGNED,这不是动态的。

INT UNSIGNED0 to 4,294,967,295

INT SIGNED具有范围-2,147,483,648 to 2,147,483,647

的范围,如果连一个行有一个负值,你必须使用INT SIGNED。给列提供范围-2,147,483,648 to 2,147,483,647

0

不,范围不会动态调整为填充数据。无论表格已包含什么,SIGNEDUNSIGNED范围都是原始范围。

CREATE TABLE `testing` (
    `x` INT(11) NULL DEFAULT NULL 
) 
ENGINE=InnoDB 
; 

INSERT INTO testing VALUES (-1); 
SELECT * FROM testing; 
INSERT INTO testing VALUES (4000000000); 
SELECT * FROM testing; 

返回“超出范围错误”,并且数据将是“-1; 2147483647”(最大SIGNED INT 32位)