整數
總共有兩種數字類型:整數和實數(有小數部分的)。如果你儲存的是整數,使用下列的整型:TINYINT,SMALLINT,MEDIUMINT,INT或者BIGINT。它們分別需要8,16,24,32,以及64位的儲存空間。它們儲存的值範圍為N就是它們使用的儲存空間所需的位元。
整型有個一個可選擇的參數,就是UNSIGNED,它不允許儲存負數,而正數的最大上限變為之前的大約兩倍左右。舉個例子,一個TINYINT UNSIGNED儲存的範圍是0-255,而不是之前的-128-127.
有符號和無符號類型使用了相同大小的儲存空間,它們的效能是一樣的,因此使用哪種類型取決儲存的資料範圍。
你的選擇決定了MySQL在記憶體和硬碟上儲存資料的方式。然而,即使在32位的架構上,整型的計算常常使用64位的BIGINT.(例外的情況一般發生在使用DECIMAL或者DOUBLE計算的彙總函式上)。
MySQL允許你指定整型的“寬度”,比如INT(11).對大多數應用來說沒有什麼意義:它並不會約束值的範圍,但是可以簡單的指定MySQL互動工具的字元數。只是限制顯示而已。對於儲存和計算,INT(1)和INT(20)是等同的。
實數
實數的數字帶有小數部分。然而它們並不僅僅是小數。它也能儲存一些大到連 BIGINT都儲存不下的整數。MySQL同時支援精確和不精確兩種類型。
FLOAT和DOUBLE支援近似的標準浮點運算。如果你需要知道準確的浮點運算結果,你需要研究你的平台的浮點實現方式。
DECIMAL類型儲存了準確的浮點數。在MySQL5.0以上版本,都支援準確的運算。MySQL4.1較早版本,一般浮點運算會得到比較奇怪的值,因為丟掉了精度。在這些MySQL版本中,DECIMAL只不過是儲存類型而已。
MySQL5.0以上版本的伺服器自身去運行DECIMAL運算,是因為CPU並不直接支援這種計算。浮點運算稍微快些,因為CPU本地執行了這些運算。
浮點和DECIMAL類型都允許你指定精度。對於DECIMAL,你可以指定小數點之前和之後的數字最大的數量。這個決定了列的消耗空間的大小。MySQL5.0以上版本把數字打包進了一個二進位字串(每四個位元組包含了九個數字)。比如DECIMAL(18,9)會在小數點兩邊各儲存9個數字,使用的空間為9位元組:4個位元組儲存了小數點之前的數字,1個位元組儲存了小數點,另外4個位元組儲存了小數點之後的數字。
一個DECIMAL數在MySQL5.0以上版本中最高上限的數字個數為65。早期的MySQL版本中限制為254,並且儲存數值並沒有壓縮(一個位元組一個數字)。然而,這些版本中,並不能使用這些大數值進行計算,因為DECIMAL就是個儲存類型而已。要計算的話,只能把DECIMAL轉換為DOUBLE了。
指定浮點數的精度有兩種方法,不同的方法導致了MySQL選擇不同的類型以及近似的儲存數值。精度的指定並不是標準的,因此我們建議指定你希望的類型而不是精確度。
儲存相同的數值範圍的情況下,浮點類型要比DECIMAL使用更少的空間。一個FLOAT列使用了4個位元組。DOUBLE消耗了8個位元組以及有更好的精度和更大的值的範圍。像Integer一樣,你僅僅選擇的是儲存類型。MySQL在浮點運算中,使用DOUBLE進行運算。
因為需要額外的儲存空間和計算的消耗。你使用DECIMAL的情況為你需要使用精確的結果。比如,儲存的是財政資訊。