好的,所以我知道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?
答案 0 :(得分:2)
所以更具体地说明INT
数据类型;您可以拥有INT UNSIGNED
或INT SIGNED
。创建列时设置此项。我相信如果你没有指定,它默认为SIGNED
。因此,任何INT
列都是SIGNED
或UNSIGNED
,这不是动态的。
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)
不,范围不会动态调整为填充数据。 SIGNED
和UNSIGNED
范围是原始范围,无论表格已包含什么。
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位)