MySQL中的 double/float/numeric/decimal 的區別

MySQL中所有數值型數據,統稱爲Numeric Type

 

各字段類型中:

DECIMAL和NUMERIC意義相等,用法相同,都是是fixed-point type(exact value)

FLOAT/DOUBLE 類型,分別代表單精度浮點/雙精度浮點類型。不管如何提高精度,也是floating-point type(approximate value),用來進行高精度計算會出問題;auto_increment特性在版本8從這兩種類型上棄用。這兩種類型後續也將被棄用。

 

附錄如下:

DATA TYPE 字段類型 說明

 

 

 

 

 

Numeric Type

 

 

 

 

 

 

 

BIT

bit-value type,取值範圍1-64,若不指定默認爲1

BIT(M)類型在賦值時,如果沒有完全用完位數會自動填充補齊 e.g. assigning a value of b'101' to a BIT(6) column is, in effect, the same as assigning b'000101'

TINYINT

取值範圍 -128 ~ 127(signed),0 ~255(unsigned)

BOOL/BOOLEAN

類型和TINYINT(1)相等,0表示false,1表示True

(非0的2-9 均識別爲True,但True只識別爲1)

SMALLINT

取值範圍-32768 ~ 32767(signed), 0 ~ 65535(unsigned)

MEDIUMINT

取值範圍 -8388608 ~ 8388607,0 ~ 16777215

INT/INTEGER

取值範圍 -2147483648 ~ 2147483647, 0 to 4294967295

BIGINT

取值範圍 -9223372036854775808 ~ 9223372036854775807(signed), 0 ~ 18446744073709551615(unsigned)

MySQL數學運算都使用 signed 的 BIGINT 和 DOUBLE,所以unsigned的BIGINT 不能超過signed的BIGINT最大值(922..., 63bits),不然會自動轉爲DOUBLE處理,發生計算錯誤

BIGINT還在MYSQL的運算中有這樣的應用,min() max() 整數之間的+ - *

DECIMAL(M [, D])

syn: DEC,NUMERIC,FIXED

M表示digits的位數(精度),D是小數點後允許的位數,M最大是65(默認爲10),D最大是30(默認爲0)

非整數間的 + - * 都使用DECIMAL

同義詞類型中FIXED適配其他的DBS 

FLOAT(M, D)

單精度浮點數,Permissible values are -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38(IEEE標準,取決於硬件和OS可能更小)

M是digits總位數,D表示小數點後的位數,省略時,默認按OS支持的最大,通常float對應的decimal place是7

FLOAT[M, D]是一種不標準的MySQL擴展,這種語法正在棄用並將在後續被徹底移除

FLOAT(P)

浮點數without M和D,p表示bits精度,MySQL中,p在0~24認爲是單精度浮點數(FLOAT),p在25~53認爲是雙精度浮點數(DOUBLE)。

這種語法是爲了ODBC適配。

ODBC(Open Database Connectivity,開放數據庫互連)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分

DOUBLE(M, D)

Syn: DOUBLE PRECISION 和 REAL

DOUBLE PRECISION(M, D), REAL(M, D) 

雙精度浮點數,Permissible values are -1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308(IEEE標準,實際更小)

M是digits總位數,D表示小數點後的位數,無時默認按OS支持的最大,通常decimal對應的decimal place是15

DOUBLE[M, D]是一種不標準的MySQL擴展,這種語法正在棄用並將在後續被徹底移除

DOUBLE PRECISION 和 REAL 是DOUBLE的同義詞,但如果設置了READL_AS_FLOAT則REAL表示FLOAT類型而非DOUBLE

 

MySQL 8.0 文檔中爲例)

發佈了14 篇原創文章 · 獲贊 2 · 訪問量 3970
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章