2013年1月17日 星期四

MySQL資料型態儲存範圍和所須空間

有時想知道某欄位型態的能儲存的範圍、所占的儲存空間...等,
但官網資料跳來跳去,所以參考了一些資料,整理成表格。

數字(Numeric)

資料類型 儲存空間(Bytes) 最小值(Signed/Unsigned) 最大值(Signed/Unsigned)
TINYINT 1 byte -128 127
0 255
SMALLINT 2 bytes -32768 32767
0 65535
MEDIUMINT 3 bytes -8388608 8388607
0 16777215
INT,INTEGER 4 bytes -2147483648 2147483647
0 4294967295
BIGINT 8 bytes -9223372036854775808 9223372036854775807
0 18446744073709551615
FLOAT(p) 4 bytes ( 0 <= p <= 24 )
8 bytes ( 25 <= p <= 53)
p represents the precision in bits,
但MySQL僅將p用來決定使用FLOAT或DOUBLE資料型態。
p 的範圍是 0 ~ 24 ,即為沒設定(M.D)的 FLOAT 資料型態。
p 的範圍是 25 ~ 53,,即為沒設定(M.D)的 DOUBLE 資料型態。
FLOAT[(M,D)] 4 bytes -3.402823466E+38 to -1.175494351E-38
, 0
, and 1.175494351E-38 to 3.402823466E+38
DOUBLE [(M,D)] 8 bytes
M = 整數位數+小數位數
D=小數位數
省略[(M,D)],
將以硬體所能儲存的為限制
-1.7976931348623157E+308 to -2.2250738585072014E-308
, 0
, and 2.2250738585072014E-308 to 1.7976931348623157E+308
REAL 8 bytes DOUBLE別名.
但當 REAL_AS_FLOAT 模式打開, REAL變成FLOAT 的別名。
DECIMAL(M,D)
別名:
NUMERIC(M,D)
DEC(M,D)
FIXED(M,D)
每9個數字須要4 bytes,
數字個數與所佔空間關係參照
(註1)
M:1~65 (舊版本:1~254)
D:0~30
BIT(M) 大約 (M+7)/8 bytes M:1~64 (預設:1)
註1:DECIMAL 型態每9個數字須 4 Bytes(整數、小數分開計算),0~9 個數字所需的儲存空間對照表如下。
不滿9個數字 所需 Bytes
0 0
1~2 1
3~4 2
5~6 3
7~9 4
例如:123456.123 => decimal(9,3) => 整數有 6 個數字,小數有 3 個數字。所需空間 = 3Bytes + 2Bytes = 5 Bytes
例如:12345678901234.123456 => decimal(20,6) => 整數有 14 個數字,小數有 6 個數字。所需空間 = (4Bytes+3Bytes) + 3Bytes = 10 Bytes

時間(Date and Time)

資料類型 儲存空間(MySQL 5.6.4以前) 儲存空間(MySQL 5.6.4) 範圍
YEAR 1 byte 1 byte YEAR(4):1901 ~ 2155, 或0000
  • 4位數的字串:'1901' ~ '2155'.
  • 4位數的數字:1901 ~ 2155.
  • 1或2位數的字串:'0' to '99'.
    '0' ~ '69' 會轉換成 2000 ~ 2069,
    '70' ~ '99' 會轉換成 1970 ~ 1999.
  • 1或2位數的數字:1 ~ 99.
    1 ~ 69 會轉換成 2001 ~ 2069
    70 ~ 99 會轉換成 1970 ~ 1999
DATE 3 bytes 3 bytes '1000-01-01' ~ '9999-12-31'
TIME 3 bytes 3 bytes + 秒的小數部分所需儲存空間(註2) -838:59:59' ~ '838:59:59'
DATETIME 8 bytes 5 bytes + 秒的小數部分所需儲存空間(註2) '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
儲存的值,顯示時,不會隨 MySQL 時區 time_zone 設定不同而不同
TIMESTAMP 4 bytes 4 bytes + 秒的小數部分所需儲存空間(註2) '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC
儲存的值,顯示時,會隨 MySQL 時區 time_zone 設定不同而不同
註2:秒的小數部分所需儲存空間
秒的小數位數 所需儲存空間
0 0 bytes
1 1 byte
2 1 byte
3 2 bytes
4 2 bytes
5 3 bytes
6 3 bytes


字串(String)

資料類型 儲存空間
CHAR(M) M × w bytes, 0 <= M <= 255, (w 是字符集中字符所需的最大儲存空間)
BINARY(M) M bytes, 0 <= M <= 255
VARCHAR(M), VARBINARY(M) L + 1 bytes:當字數所需儲存空間在 0~255 bytes 時。
L + 2 bytes:當字數所需儲存空間會超過 255 bytes 時。
TINYBLOB, TINYTEXT L + 1 bytes, L < 28
BLOB, TEXT L + 2 bytes, L < 216。不能有預設值(註3)
MEDIUMBLOB, MEDIUMTEXT L + 3 bytes, L < 224
LONGBLOB, LONGTEXT L + 4 bytes, L < 232
ENUM('value1','value2',...) 1 或 2 bytes, 依列舉的數量而定 (列舉數量最大65,535)
SET('value1','value2',...) 1, 2, 3, 4, 或 8 bytes, 依SET的成員數量而定 (最多64 個成員)
L:the byte length of the string
註3:官方文檔說明「BLOB, TEXT, GEOMETRY, and JSON columns cannot be assigned a default value.」


參考資料:
http://dev.mysql.com/doc/refman/5.6/en/numeric-type-overview.html
http://dev.mysql.com/doc/refman/5.6/en/numeric-types.html#integer-types
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
http://dev.mysql.com/doc/refman/5.6/en/datetime.html
http://dev.mysql.com/doc/refman/5.6/en/time.html
http://dev.mysql.com/doc/refman/5.1/zh/precision-math.html
http://help.scibit.com/mascon/masconMySQL_Field_Types.html
MySQL :: MySQL 5.7 Reference Manual :: 11.7 Data Type Default Values
MySQL :: MySQL 5.7 Reference Manual :: 11.4.3 The BLOB and TEXT Types

沒有留言:

張貼留言