MySQL int 類型的長度和範圍解惑

開發過程當中,新來的小朋友問到: MySQL見表過程當中,字段類型爲int的長度是什麼意思?最大值是 999999999 嗎?html

雖然知道 int(1) 這個並不表示只能表示 0-9 等,可是替換到 int(11) 的時候思惟有時候會緩不過來,直到有一次需求要求 指定字符長度 的時候才恍然大悟, int(6) 就是 000001 ~ 099999 等等,可是依舊能夠表示 12345678 等數字mysql

提問

Mysql 建表過程當中:sql

  1. 字段類型int的長度表明什麼?
  2. 是表示值的最大寬度嗎?或者是位數嗎?
  3. 爲何 int(1) 的時候我能夠存儲 100、10000、100000 呢,甚至能夠存儲 2147483647 呢?
  4. 爲何 Int(1) 的時候我不能存儲 4294967295 而能夠存儲 2147483647 ?

分析

MySQL中int類型佔用4個字節[byte(B)],1B有8個位[bit(b)],一個位(b)就表明一個0或者1,那麼MySQL中int佔用4B,對應位就是 4*8b = 32b 了,也就是說 int 表示的數字 個數 是: 2的32次方。htm

由於字節分有符號和無符號兩種,因而 int 有符號 的 範圍就是 -2的31次方 到 2的31次方減去1 [?1 爲何不是32次方?] [?2 爲何要減去1?],即 -2147483648 ~ 2147483647; int 無符號(unsigned) 的 範圍就是 0 到 2的32次方減去1。開發

知道了 int 類型的範圍後,咱們再來看看長度是什麼意思。 在MySQL手冊中,字段類型的長度用 「M」 表示,表示最大顯示寬度。 int 的 最大有效顯示寬度是 255。 注意: 此處表示 顯示寬度 和 存儲大小或類型及範圍 無關get

問中問

  • ?1 爲何不是32次方?
    • 由於有一個位要表示符號
  • ?2 爲何要減去1?
    • 由於 32 位在二進制中最大表示 32 個 1 ,因此就存在着 減去 1

解答

  1. 字段類型int的長度表示有效寬度,配合 zerofill 的話會更容易理解。 但這個有效寬度並非表示這個值的範圍,也就是說能夠超過這個有效寬度
  2. 不是表示這個數字的最大佔位寬度,也不是表示這個數字的佔位個數。而是表示默認的顯示寬度(當 zerrofill 時)
  3. int(1) 的時候能夠存儲 100、10000、100000,甚至能夠存儲 2147483647,是由於 int 表示 數值的範圍, 1表示有效顯示寬度
  4. Int(1) 的時候不能存儲 4294967295 而能夠存儲 2147483647,是由於 int 有 有符號 和 無符號 兩種表示方式,你選擇的是 有符號的方式。

總結

  1. 數值類型的長度及範圍是兩碼事,不能混爲一談
  2. MySQL中數值的範圍是根據位來肯定的
  3. 在建立表的過程當中能夠根據這個數值的實際範圍來選擇 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 等

擴展

  • MySQL數值相關的範圍及佔用字節數
類型 佔用字節數 有符號取值範圍 無符號取值範圍
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT 4 -2147483648 ~ 2147483647 0 ~ 4294967295
BIGINT 8 -2^63 ~ 2^63-1 0 ~ 2^64-1

參考文章

相關文章
相關標籤/搜索