在这种情况下,MySQL INT列的实际范围是多少?

时间:2015-10-14 13:24:48

标签: mysql

好的,所以我知道MySQL中的INT类型范围为0到4,294,967,295或-2,147,483,648到2,147,483,647 MySQL reference

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

4 个答案:

答案 0 :(得分:2)

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

INT UNSIGNED的范围为0 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

答案 1 :(得分:1)

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

如果指定UNSIGNED,则扩展数据类型的上限(假设有问题的数据类型有SIGNED / UNSIGNED选项),但是你也失去了低端范围。如果您指定SIGNED或根本不指定任何内容(则默认SIGNED将适用),则您的上限是SIGNED范围的上限。

因此,对于SIGNED类型的INT列(如果未指定属性),您的范围为-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属性。

答案 2 :(得分:0)

范围0到4,294,967,295适用于UNSIGNED。举个例子:

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

你必须专门设置列的无符号状态,否则它被认为是有符号的,其范围为-2,147,483,648到2,147,483,647

答案 3 :(得分: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位)