好了,我知道在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