三:MySQL中的數據類型 - 系統的擼一遍MySQL

MySQL中但數據類型主要分爲 數值類型、字符串類型、日期時間類型,隨着MySQL版本升級,每每會對一些數據類型進行優化。sql

數值類型

整型

數據類型 字節 有符號 無符號
TINYINT 1

-128 ~ 127函數

0 ~ 255性能

SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT 4 -2147483648 ~ 2147483647 0 ~ 4294967295
BITINT 8 -9233372036854775808 ~ 9223372036854775807 0 ~ 8446744073709551615

數值寬度

整型的數據類型能夠指定數值的寬度好比:優化

//默認的INT型 字寬爲11
INT(11)
//指定寬度爲4的時候 若是配合ZEROFILL使用 若是不足4位將會在前面補0
INT(4)

有符號和無符號

默認狀況下若是沒有指定是否有符號則默認爲有符號(SIGNED),若是指定ZEROFILL會自動設置爲無符號(UNSIGNED)。編碼

AUTO_INCREMENT

整型能夠設置 AUTO_INCREMENT 屬性保持該字段能夠自動增加,該字段應該設置爲主鍵約束或增長惟一索引而且將其設置爲NOT NULL。spa

浮點型

數據類型 字節
float 4
double 8

精度

浮點數能夠指定 整數位和小數位,例如:code

//若是沒有設置精度 則按真實數值進行存儲,若是指定精度則根據精度四捨五入
create table test(
`float_def` float,
`float_var` float(6, 2),
`double_var` double(6, 2)
)

定點數

數據類型 字節
DECIMAL(M,D) M+2

精度

定點數也能夠指定精度,例如:索引

//若是沒有指定精度,默認定義爲:DECIMAL(10,0)
//若是插入數值精度高於定義精度,則四捨五入同時出發一個Warning
create table decTable (
dec_def decimal,
dec_var decimal(5, 2)
)
//好比以下方法插入,插入結果 dec_var = 4.57
insert into decTable values(10, 4.567);

BIT型

數據類型 字節
BIT(M) 1 - 8

bit型以二進制位進行存儲 BIT(1)表示1位,最大支持64位也就是8個字節長度。ci

查看BIT類型的字段可使用 HEX函數 以十六進制的方式查看,或者BIN函數以二進制方式查看。字符串

日期時間類型

數據類型 字節 最小值 最大值
DATE 4 1000-01-01 9999-12-31
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59
TIME 3 -838:59:59 838:59:59
YEAR 1 1901 2155
TIMESTAMP 4 19700101080001 2038年

DATETIME 類型 爲 DATE 和 TIME 類型的結合。

任何YYYYMMDDHHMMSS類型的數據只要數值符合合法日期,均可以進行插入不管用什麼符號分隔。

TIMESTAMP 與 DATETIME 區別

TIMESTAMP 能夠增長 CURRENT_TIMESTAMP 爲默認值,當插入爲NULL的時候自動設置爲系統當前時間。

TIMESTAMP與時區相關,會根據MySQL設置的時區進行日期的轉換。

TIMESTAMP 與 DATETIME 的取值範圍也不一樣 TIMESTAMP 支持但範圍較小。

字符串類型

數據類型 描述
CHAR(M) M 爲 0 - 255
VARCHAR(M) M 爲 0 - 65535,UTF8編碼 爲 0 - 65535/3
TINYBLOB 0 - 255
MEDIUMBLOB 0- 65535
BLOB 0 - 167772150
LONGBLOB 0 - 4294967295
TINYTEXT 0 - 255
TEXT 0 - 65535
MEDIUMTEXT 0 - 167772150
LONGTEXT 0 - 4294967295
VARBINARY(M) 0 - M
BINARY(M) 0 - M

CHAR 與 VARCHAR 區別

首先以下例子:

//表示 長度爲4,若是插入小於4個字符的將在結尾進行空格補齊,並在查詢時去掉結尾空格
CHAR(4)
//表示 最大長度爲4,若是插入小於4個字符,則長度爲插入的字符書,查詢時不會去掉結尾空格
VARCHAR(4)

其次,VARCHAR會根據字段的編碼類型決定其長度範圍。

不一樣存儲引擎下CHAR於VARCHAR是用方式的不一樣

  MyISAM InnoDB Memory
CHAR 所有CHAR爲靜態表,效率高 浪費空間  
VARCHAR 包含VARCHAR爲動態表,有碎片 節省空間,最小化IO VARCHAR做爲CHAR處理

TEXT於BLOB

用於存儲大文本,TEXT保存字符串,BLOB保存二進制數據,頻繁刪改會致使空洞紀錄影響性能。

BINARY類型

BINARY 與 VARBINARY的區別 與CHAR 與 VARCHAR的區別相同。

可是BINARY類型當插入長度小於定義長度會在結尾補齊0x00,這是與CHAR類型的一個區別

其餘類型

ENUM類型

枚舉類型須要在定義的時候指定取值範圍,而且插入的內容必須在定義的範圍以內,不然會默認爲枚舉範圍的第一個。

枚舉類型 佔用 空間爲 1 - 2個字節,分別對應 0 - 255 和 0 - 65535個枚舉值的範圍。

SET類型

SET類型與枚舉類型相似,都須要在定義字段的時候指定取值範圍,區別是SET類型能夠在插入的時候同時插入多個取值範圍內的值。

SET類型 佔用空間爲 1 - 8個字節,分別對應 0 - 64 位,其中每個二進制位表示一個成員值,也就是說最多能夠支持64個成員值。

相關文章
相關標籤/搜索