本文更新于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[,...]')
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26193.html
標籤:MySQL
