本文更新於2019-06-19,使用MySQL 5.7,操作系統為Deepin 15.4。 數值類型 整數類型 type[(m)] [UNSIGNED] [ZEROFILL] [AUTO_INCREMENT] 類型 位元組 最小值 最大值 TINYINT 1 有符號-128,無符號0 有符號127,無 ...
本文更新於2019-06-19,使用MySQL 5.7,操作系統為Deepin 15.4。
目錄
數值類型
整數類型
type[(m)] [UNSIGNED] [ZEROFILL] [AUTO_INCREMENT]
類型 | 位元組 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | 有符號-128,無符號0 | 有符號127,無符號255 |
SMALLINT | 2 | 有符號-32768,無符號0 | 有符號32767,無符號65535 |
MEDIUMINT | 3 | 有符號-8388608,無符號0 | 有符號8388607,無符號16772150 |
INT/INTERGER | 4 | 有符號-2147483648,無符號0 | 有符號2147483647,無符號4294967295 |
BIGINT | 8 | 有符號-9223372036854775808,無符號0 | 有符號9223372036854775807,無符號18446744073709551615 |
m
用於指定顯示寬度。上面列出的屬性為整數類型特有。ZEROFILL
表示位數不夠顯示寬度時在前補0,且自動添加UNSIGNED
屬性。AUTO_INCREMENT
從1開始,一個表只能有一個AUTO_INCREMENT
的列,且必須為NOT NULL
,並且必須為PRIMARY KEY
或UNIQUE
。AUTO_INCREMENT
的列如插入0或NULL
,則插入自動增長後的值。
定點數類型
定點數實際是以字元串形式存放。
DECIMAL[(m, d)]
類型 | 位元組 | 最小精確度 | 最大精確度 |
---|---|---|---|
DECIMAL | m+2 | 由m、d決定,不能超過±2.2250738585072014E-308 | 由m、d決定,不能超過±1.7976931348623157E+308 |
m
表示精度(有效位數),d
表示標度(小數位數),預設為(10, 0)。
浮點數類型
type[(m, d)]
類型 | 位元組 | 最小精確度 | 最大精確度 |
---|---|---|---|
FLOAT | 4 | ±1.175494351E-38 | ±3.402823466E+38 |
DECIMAL | 8 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 |
其使用類似DECIMAL
,但(m, d)
是非標準用法,不建議使用。
位類型
BIT(m)
類型 | 位元組 | 最少位數 | 最多位數 |
---|---|---|---|
BIT | 1~8 | 1 | 64 |
m
取值從1至64,預設為1。插入時,會將數值轉換成二進位,查詢時直接SELECT
會看不到結果,需使用BIN(value)
或HEX(value)
函數。
日期時間類型
類型 | 位元組 | 最小值 | 最大值 |
---|---|---|---|
YEAR | 1 | 1901 | 2155 |
TIME | 3 | -838:59:59 | 838:59:59 |
DATE | 4 | 1000-01-01 | 9999-12-31 |
TIMESTAMP | 4 | 1970-01-01 00:00:00 | 2038-01-19 03:14:07 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
如需查看TIMESTAMP
時間戳數值,則需對其進行"+0"數值運算。表中只能有一列TIMESTAMP
預設值為CURRENT_TIMESTAMP
,該列在插入或更新時都會自動設置為當前時間。TIMESTAMP
與時區有關,DATETIME
只與插入時的時區有關。
插入日期時間的格式有多種,下麵以DATETIME
為例:
- 'YYYY-MM-DD HH:MM:SS':允許不嚴格的間隔,即任何標點符都可當作日期間隔('-')或時間間隔(':')。若包含日期間隔,月和日可取一位;若包含時間間隔,時分秒均可取一位。
- 'YYYYMMDDHHMMSS'
- YYYYMMDDHHMMSS
對於DATETIME
,時分秒可從後往前省略,省略值設置為0。
字元串類型
類型 | 位元組 | 值最小長度 | 值最大長度 |
---|---|---|---|
CHAR(m) | m個字元位元組數 | 0 | m字元(不能超過255位元組) |
VARCHAR(m) | 值位元組數+1 | 0 | m字元(不能超過65535位元組) |
BINARY(m) | m | 0 | m位元組(不能超過255) |
VARBINARY(m) | 值位元組數+1 | 0 | m位元組(不能超過65535) |
TIINYBLOB | 值位元組數+1 | 0 | 255位元組 |
BLOB | 值位元組數+2 | 0 | 65535位元組 |
MEDIUMBLOB | 值位元組數+3 | 0 | 167772150位元組 |
LONGBLOB | 值位元組數+4 | 0 | 4294967295位元組 |
TINYTEXT | 值位元組數+1 | 0 | 255位元組 |
TEXT | 值位元組數+2 | 0 | 65535位元組 |
MEDIUMTEXT | 值位元組數+3 | 0 | 167772150位元組 |
LONGTEXT | 值位元組數+4 | 0 | 4294967295位元組 |
CHAR
使用空格填充,BINARY
使用\0
填充。比較時CHAR
會忽略尾部的空格,BINARY
不會忽略尾部的\0
。
CHAR
為定長字元串,VARCHAR
為變長字元串。InnoDB存儲引擎建議使用VARCHAR
,因內部的行存儲格式使用指向字元串值的頭指針。MyISAM存儲引擎建議使用CHAR
。MEMORY存儲引擎無論使用CHAR
還是VARCHAR
,都是作為定長字元串存儲。
存儲少量字元串時使用CHAR
或VARCHAR
,在存儲較大文本時,使用[*]TEXT
或[*]BLOB
。[*]BLOB
還可以用來存儲二進位數據。使用[*]TEXT
或[*]BLOB
需註意如下問題:
- 使用
[*]TEXT
或[*]BLOB
會導致一些性能問題,特別是執行刪除操作後數據表會留下“空洞”,建議定期使用OPTIMIZE TABLE tablename
進行碎片整理。 - 使用首碼索引或根據內容的散列值創建的合成索引,提高查詢性能。
- 在不必要的時候,避免
SELECT
出[*]TEXT
或[*]BLOB
,否則會導致在網路上傳輸大量的數據。 - 把
[*]TEXT
和[*]BLOB
分離到單獨的表中。
枚舉類型
ENUM('value'[, ...])
類型 | 位元組 | 最少成員 | 最多成員 |
---|---|---|---|
ENUM | 1~2 | 1 | 65535 |
ENUM
類型忽略大小寫。若插入不在ENUM
指定範圍內的值時,會轉為插入第一個值。插入語句如下:
INSERT INTO TABLE tablename(colname) VALUES('value')
集合類型
SET('value'[, ...])
類型 | 位元組 | 最少成員 | 最多成員 |
---|---|---|---|
SET | 1~8 | 1 | 64 |
SET
類型不能插入不在指定範圍內的值,且插入時會對值集合進行排重。插入語句如下:
INSERT INTO TABLE tablename(colname) VALUES('value[,...]')