1. 程式人生 > >mysql5.7官網直譯資料型別--數字型別詳解

mysql5.7官網直譯資料型別--數字型別詳解

11.2 Numeric Types 數字型別
11.2.1 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT 整數型別(精確值)
11.2.2 Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC 定點型別
11.2.3 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE 浮點型別
11.2.4 Bit-Value Type - BIT 位值型別
11.2.5 Numeric Type Attributes 數字型別屬性
11.2.6 Out-of-Range and Overflow Handling 溢位處理
MySQL支援所有的標準SQL數字資料型別。這些型別包括精確數字資料型別(INTEGER, SMALLINT, DECIMAL, and NUMERIC), 也有大概數字資料型別 (FLOAT, REAL, 和雙精度). 關鍵字INT是INTEGER的同義詞, 關鍵詞 DEC 和 FIXED是DECIMAL的同義.
MySQL按雙精度同義來對待DOUBLE(一個非標準的擴充套件). MySQL也同樣對待REAL當做雙精度(一個非標準擴充套件), 只要REAL_AS_FLOATSQL模型可用.
BIT資料型別儲存位值並且在MyISAM,MEMORY,InnoDB,和NDB表中都得到支援。
對於MySQL處理溢位列值的相關資訊和對錶達式的評估,看部分11.2.6"Out-of-Range and Overflow Handling"
對於數字型別儲存要求的資訊,請看部分11.8“Data Type Storage Requirements”.
用於計算數值運算元的結果的資料型別取決於運算元的型別及其執行的運算元。更多資訊請看12.6.1, “Arithmetic Operators”.運算元
-----------------------------------------
11.2.1 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
MySQL支援標準SQL的整數型別INTEGER(or INT)和SMALLINT。作為一個隊標準的擴充套件, MySQL 還支援的型別是 TINYINT, MEDIUMINT, 和 BIGINT. 下面的表格展示了儲存要求和每種型別的值範圍.
-----------------------------------------
11.2.2 Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC 定點型別(精確值)
DECIMAL 和 NUMERIC 型別儲存精確數字資料置. 當需要儲存高精度值時可以使用這些資料型別, 例如貨幣相關資料. 在MySQL中, NUMERIC是作為DECIMAL的一種實現, 所以關於DECIMAL的如下標記同樣適用於NUMERIC.
MySQL儲存DECIMAL值以二進位制格式。看12.21的"Precision Math"
在一個DECIMAL列的宣告中,精確度和範圍通常可以設定;例如:
salary DECIMAL(5,2)
在這個例子中,5是精確度,2是規模。精確度表示有效數字的個數在值中儲存的, 而規模表示小數點後的數字個數。
標準SQL要求DECIMAL(5,2)能夠儲存任何五位數和2位小數點的值, 所以可以儲存的值範圍在salary列是 -999.99到999.99.
在標準SQL中,語法DECIMAL(M)於DECIMAL(M,0)等價。簡單來說DECIMAL的語義和DECIMAL(M,0)一樣。, 其中允許執行決定M的值。MySQL支援這些對DECIMAL的變體. M的預設值是10.
如果scale 是 0, DECIMAL值包含不包含小數點和小數部分.
DECIMAL最大的數字是65位,但是實際範圍會根據給出的列中對精確度和規模的限制來決定。如果給出的值中在小數點後跟著太多位數,則會轉變為指定位數 (精確度是作業系統來設定的,但影響就是允許擷取的數字.)
-------------------------------------------
11.2.3 Floating-Point Types (Approximate Value) - FLOAT, DOUBLE 浮點數型別(大概值)。
FLOAT 和 DOUBLE 型別表示大概的數字型別值。對於單精度的值mysql使用4位元組來儲存,而雙精度採用8位元組來儲存。
對於FLOAT,SQL標準允許對括號中關鍵字浮動之後的位精度優化(但不是指數的範圍),MYSQL也支援這樣的特定優化,但是精度值只是被用來確定儲存大小。精度結果0-24在一個4位元組的單精度FLOAT列中。而值在24-53則是一個8位元組的雙精度DOUBLE列。
MYSQL允許一個標準的語法:FLOAT(M,D)或者REAL(M,D)或者DOUBLE PRECISION(M,D)。其中,(M,D) 意味著能夠儲存的值最多M個數字,D數字是點號後的可能數位。例如,列定義為FLOAT(7,4),那麼-999.9999可以被展示。MYSQL允許四捨五入,如果你插入999.00009 到一個FLOAT(7,4)的列,則可能的值為:999.0001.
因為浮點值是大概值並且不儲存精確值,如果把它當做精確值來處理,會有一些問題。他們也受平臺或者相關依賴的影響。更多資訊,請看B.5.4.8,"浮點數值的問題"。
為了最大可移植性,編碼要求儲存了大約值使用FLOAT或者DOUBLE精度,沒有特別準確的值,或者數字位.
------------------------------------------
11.2.4 Bit-Value Type - BIT 位值型別
BIT資料型別用於儲存bit值。BIT(M)能夠粗儲存M-bit值。M的範圍是1到64。
為了設定bit值,b'value'標記法能夠被使用。value是用0和1寫的二進位制值。例如,b'111'和b'10000000'表示的值分別是7和128.看9.1.5位值的直接量。
如果你設計一個值為一個BIT(M)位的列儲存少於M位長度的值,那麼左側位值會用0來填充。例如,儲存b'101'到一個BIT(6)的列中,那麼其實儲存為b'000101'.
NDB叢集中所有BIT列使用在一個NDB表中的最大結合大小不能超過4096bits.
-------------------------------------------
11.2.5 Numeric Type Attributes 數字型別的屬性
MySQL支援擴充套件,可以選擇在型別的基本範圍後面指定整數資料型別的顯示寬度。例如,INT(4)設定一個INT的展示寬度為4個數字。 這種優化展示可由應用程式使用以顯示具有小於為列指定的寬度的整數值,銅鼓將它們與空格隔開。(也就是說,這個寬度表示被返回的元資料的結果集,是否使用取決於應用程式)
展示寬度並不會限制儲存在列中的值的範圍。也不阻止比列顯示寬度更大的值被正確顯示。例如,一個列被設定為SMALLINT(3)也有SMALLINT的儲存範圍-32768 到 32767,並且多出三位的值將使用三位以上的全部顯示。
當和優化ZEROFILL屬性一起來使用時,空間的預設填充是使用0來填充的。例如,如果一個列宣告為INT(4) ZEROFILL,值5將會被儲存為0005.
注意:
ZEROFILL屬性會被忽略,當一個列被使用到表示式或者UNION查詢的時候。
如果你儲存的值比要展示的整數列更大,且設定了列屬性ZEROFILL,你可能會遇到一些問題,當mysql為一些複雜的連線產生的臨時表。在這種情況下,mysql假設了資料值可以在被展示的列中填充。
所有的整數型別能夠有一個優化(非標準)屬性UNSIGNED.Unsigned型別能夠用於儲存非負數在一個列或者當你需要一個更大的範圍對列。例如,如果INT列被設定為UNSIGNED,列的範圍的大小是相同的,但是開始和結束點不同,由原來的-2147483648 到 2147483647變為0 到4294967295


浮點型別和定點型別也能夠使用UNSIGNED,就像整數型別一樣,這一屬性不允許負數值儲存在列。不像整數型別。列的上限值依然相同。
如果你設定了ZEROFILL對一個數字列,MYSQL自動新增UNSIGNED屬性到列。INTEGER 或者浮點資料型別能夠有額外屬性AUTO_INCREMENT.當你插入一個NULL值到一個被索引的AUTO_INCREMENT列,列設定了下一個值。這個值就是value+1,其中值是當前表中列的最大值。AUTO_INCREMENT序列以1開始。
儲存0到一個AUTO_INCREMENT列和NULL儲存在列中有相同影響,除非你開啟NO_AUTO_VALUE_ON_ZERO SQL模式。
插入NULL值到自動生成的AUTO_INCREMENT值要求列被宣告為NOT NULL。如果列被宣告為NULL,插入NULL儲存一個NULL。當你插入任何一個其他值到AUTO_INCREMENT列,列被設定為其值,並且序列被重置,以至於下一個自動增長值在插入值之後。
在MYSQL5.7,負數值不允許出現在AUTO_INCREMENT列中。
------------------------------------------
11.2.6 Out-of-Range and Overflow Handling 超出範圍和溢位處理
當mysql儲存值到數字列,超過了列資料型別允許的範圍,結果依賴於SQL模式的影響時:
>如果是嚴格的SQL模式,MySQL拒絕越界值並給出一個錯誤,然後插入失敗,於SQL標準一致。
>如果不是嚴格的SQL模式,MySQL會剪下值到合適的範圍並將合適值儲存。
當一個越界值被設定到一個整數列,mysql儲存值通過正確的資料類型範圍點。
當一個浮點或者定點值列被設定的值超過了宣告中給出的範圍或者是預設的精確度,Mysql儲存值也根據範圍找到正確的點並存儲。
假設表t1的定義如下:
CREATE TABLE t1 (i1 TINYINT, i2 TINYINT UNSIGNED);
因為嚴格的SQL模型,越界錯誤發生:
mysql> SET sql_mode = 'TRADITIONAL';
mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);
ERROR 1264 (22003): Out of range value for column 'i1' at row 1
mysql> SELECT * FROM t1;
Empty set (0.00 sec)
關閉嚴格SQL模型,會儲存但是有剪下,可以通過警告看出。
mysql> SET sql_mode = '';
mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'i1' at row 1 |
| Warning | 1264 | Out of range value for column 'i2' at row 1 |
+---------+------+---------------------------------------------+
mysql> SELECT * FROM t1;
+------+------+
| i1   | i2   |
+------+------+
|  127 |  255 |
+------+------+
當嚴格SQL模式不可用時,列符號轉變會發生,因為剪下而發出的警告對ALTER TABLE,LOAD DATA INFILE,UPDATE和多列插入語句。在嚴格模型,這些語句會失敗,一些或者全部值不會被插入或改變,依賴於表是否是支援事物的和其他因素。更詳細的情形,請看5.1.8的服務SQL模式。




數字表達式求值過程中的溢位導致錯誤。例如,最大的BIGINT值是9223372036854775807,所以下面的表示式會引發錯誤:
mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'
為了能夠在這種情況下成功操作,轉變值為無符號:
mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+
是否溢位完全依賴於運算元的範圍,所以另外的方法來處理表達式是使用exact-value數字,因為DECIMAL值比INTEGER要大很多:
mysql> SELECT 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+
整數值減法,只要其中一個是無符號型別則結果也預設是無符號型別。如果結果是負數,則會是一個錯誤結果:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)


mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
如果NO_UNSIGNED_SUBTRACTIONsql模型可用的的話,結果是負數:
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
如果操作的結果是更新一個無符號整數列,結果被擷取到最大的列型別值,或者剪下為0,如果NO_UNSIGNED_SUBTRACTION模式開啟的話。
如果開啟嚴格SQL模型,會產生錯誤並且列的屬性不會改變。
到此資料型別就結束了,接下來我們看日期和時間型別