好了,我知道在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?
好了,我知道在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?
您在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到4,294,967,295的范围是UNSIGNED
。举个例子:
...
`type` int(10) UNSIGNED NOT NULL DEFAULT '0'
...
您必须专门设置否则认为是签署该列的签名状态,这将有-2,147,483,648至2,147,483,647
所以更具体有关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
。
不,范围不会动态调整为填充数据。无论表格已包含什么,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位)
容易测试插入第一4294967294,然后用2,147,483,648更新同一单元格值。然后将您的列更改为'INT UNSIGNED DEFAULT 1',然后重试。然后你会看到它的动态,除非你指定。 – HRgiger
也不要担心downvote想知道总是很好 – HRgiger
谢谢!当我投入大量精力来遵守发布规则时,我在最初的低调中感到有些恼火。但我想这就是有时会发生的事情。 – arcademonkey