譯-MYSQL5.7參考手冊--11.1.1數值型別概述

import.發表於2019-04-17

前言

本文是本人在閱讀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型別的列)
  • 如果運算兩個運算元都是整數型別
  • 你總是能通過字串的形式將一個精確的整數值儲存在BIGINT列中,MYSQL提供字串到數值的轉換
  • 當使用兩個整數進行+、-、*運算時,這意味著如果你用兩個很大的整數來執行乘法,當結果值大於9223372036854775807時你可能會得到出乎意料的結果

此段官方原文:
Some things you should be aware of with respect to BIGINT columns:

  • All arithmetic is done using signed BIGINT or DOUBLE values, so you should not use unsigned big integers larger than 9223372036854775807 (63 bits) except with bit functions! If you do that, some of the last digits in the result may be wrong because of rounding errors when converting a BIGINT value to a DOUBLE.

MySQL can handle BIGINT in the following cases:

  • When using integers to store large unsigned values in a BIGINT column.
  • In MIN(col_name) or MAX(col_name), where col_name refers to a BIGINT column.
  • When using operators (+, -, *, and so on) where both operands are integers.
  • You can always store an exact integer value in a BIGINT column by storing it using a string. In this case, MySQL performs a string-to-number conversion that involves no intermediate double-precision representation.
  • The -, +, and * operators use BIGINT arithmetic when both operands are integer values. This means that if you multiply two big integers (or results from functions that return integers), you may get unexpected results when the result is larger than 9223372036854775807.

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。

相關文章