2015-10-14 63 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位)