前言
本文是本人在閱讀MYSQL5.7參考手冊11.1.1節時翻譯的譯文,如有差錯,歡迎大家指正。
11.1.1數值型別概述
下面是關於數值資料型別的摘要,關於數值資料型別的具體屬性以及儲存要求的詳細資訊請參考11.2 節“Numeric Types”和11.8節“Data Type Storage Requirements”。
-
對於整數型別來說,M表明能夠顯示的最大寬度,最大為255,但是這個寬度與其能夠儲存的值的範圍是無關的,就如11.2節“Numeric Types”所說的那樣。對於浮點數和定點數而言,M表示其能儲存的總位數。
-
如果你為數值資料型別指定了ZEROFILL屬性,那麼MYSQL自動為該欄位新增UNSIGNED屬性。
-
數值資料型別既支援無符號數同時也支援有符號數,其預設是有符號的。所有是不需特意指定其為有符號數
-
SERIAL型別等同於建立一個BIGINT列,為其設定UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE屬性
-
SERIAL列的值具有如下屬性:NOT NULL AUTO_INCREMENT UNIQUE
這一段官方原文:
SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
SERIAL DEFAULT VALUE in the definition of an integer column is an alias for NOT NULL AUTO_INCREMENT UNIQUE.
注意:對兩個整數列使用減法,其中一個定義為是無符號數(UNSIGNED),那麼結果也會是無符號數,除非你在sql_mode中啟用NO_UNSIGNED_SUBTRACTION。詳情參見 12.10, “Cast Functions and Operators”
BIT[M]
一個二進位制型別,M表示位長度,範圍在1-64,M預設為1。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
很小的整數型別. 有符號的TINYINT能表示的範圍是-128到127。無符號TINYINT能表示的範圍是0到 255。
BOOL, BOOLEAN
這個型別等同於TINYINT(1),儲存0值代表false,儲存非0值代表true。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
小的整數型別,有符號SMALLINT能表示的範圍是範圍-32768到32767,無符號SMALLINT能表示的範圍是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
中等大小的整數型別. 有符號MEDIUMINT能表示的範圍是-8388608到8388607。無符號MEDIUMINT能表示的範圍是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
一個正常大小的整數型別.有符號INT能表示的範圍是-2147483648到2147483647。無符號INT能表示的範圍是0 到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
這個型別等同於INT
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
一個大的整數型別. 有符號BIGINT能表示的範圍是-9223372036854775808到 9223372036854775807. 無符號BIGINT能表示的範圍 0到18446744073709551615。
SERIAL等同於BIGINT,併為其設定UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE屬性。
使用BIGINT型別時你需要注意以下事情:
由於所有的運算都是使用SIGNED BIGINT或者DOUBLE來執行的,除非是在位運算中否則你都不應該使用一個大於9223372036854775807 (63 bits)的unsigned BIGINT進行運算!如果你這麼做了,那麼計算結果最後的二進位制位會出錯。因為在BIGINT轉換成DOUBLE型別時會發生錯誤
以下情況MYSQL可以對BIGINT進行正確處理:
- 使用BIGINT儲存一個很大的unsigned interger值.
- 使用MIN(col_name) or MAX(col_name)函式(col_name是一個BIGINT型別的列)
- 如果運算兩個運算元都是interger型別
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
一個"精確"的定點數字。M表示總位數(精度),D表示小數點後的位數(the scale),小數點和負值符號'-'不會被計入M。如果D=0,值沒有小數點和小數部分。對於DECIMAL型別來說,M的最大值是65,D的最大值是30。如果M不設定,預設值為10。如果D不設定,預設值為0。
- 如果指定了UNSIGNED,那麼不允許儲存負數
- DECIMAL列值之間的(+, -, *, /)運算結果的精度值為65
DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
這些型別等同於DECIMAL。FIXED型別是為了相容其他資料庫系統。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
單精度浮點型別. 儲存值允許的範圍為[-3.402823466E+38,-1.175494351E-38], 0, [1.175494351E-38,3.402823466E+38]。這是基於IEEE標準的一個理論值, 根據你的硬體和作業系統,實際範圍可能會稍微小一些。
- M是總位數,D是小數點後的位數。如果不設定M和D,儲存值的範圍在硬體允許範圍內。單精度浮點數的精度約為小數點後7位。
- 如果新增UNSIGNED屬性,則不允許儲存負值。
- 由於mysql算數運算都是基於雙精度(DOUBLE)的,所以使用FLOAT型別可能會給你帶來一些意想不到的問題,詳情見Section B.6.4.7, “Solving Problems with No Matching Rows”。
FLOAT(p) [UNSIGNED] [ZEROFILL]
浮點數型別. p表示以位為單位的精度, MSQL僅用它來決定運算結果使用FLOAT還是DOUBLE型別。如果P是[0,24],資料型別會是不指定M和D的FlOAT型別,如果p取值在[25,53],資料型別會是不指定M和D的DOUBLE型別,結果列的取值範圍和之前章節介紹的FLOAT,DOUBLE一致。
FLOAT(p)為ODBC提供相容.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
雙精度浮點型. 儲存值允許範圍[-1.7976931348623157E+308,-2.2250738585072014E-308], 0,[2.2250738585072014E-308,1.7976931348623157E+308]. 這是基於IEEE標準的理論值。根據你的硬體和作業系統,實際範圍可能會略小一些。
- M是總位數,D是小數點後的位數。如果不設定M和D,儲存值的範圍在硬體允許範圍內。雙精度浮點數的精度約為小數點後17位. *如果新增UNSIGNED屬性,則不允許儲存負值。
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]
這些型別等同於DOUBLE。注意: 如果SQL_MODE中啟用REAL_AS_FLOAT, REAL則等同於FLOAT而非DOUBLE。