整型
| 類型 | 空間 | 說明(默認(rèn)有符號) |
|---|---|---|
| TINYINT | 1字節(jié) | 取值范圍:-2^7 ~ 2^7-1 |
| SMALLINT | 2字節(jié) | 取值范圍:-2^15 ~ 2^15-1 |
| MEDIUMINT | 3字節(jié) | 取值范圍:-2^23 ~ 2^32-1 |
| INT | 4字節(jié) | 取值范圍:-2^31 ~ 2^31-1 |
| BIGINT | 8字節(jié) | 取值范圍:-2^63 ~ 2^63-1 |
值得注意的是,TINYINT(1)代表java語言中的boolean,1/0代表true/false。mysql本身沒有boolean類型。
實(shí)數(shù)
| 類型 | 空間 | 說明(默認(rèn)有符號) |
|---|---|---|
| FLOAT | 4字節(jié) | 單精度,存在精度損失(7個有效位),取值范圍:-3.402823466E+38 ~ -1.175494351E-38 |
| DOUBLE | 8字節(jié) | 雙精度,存在精度損失(15個有效位),取值范圍: -1.7976931348623157E+308 ~ -2.2250738585072014E-308 |
| DECIMAL | DECIMAL(M,D),M+2字節(jié) | M是數(shù)字的最大數(shù)目。其范圍為1~65,M的默認(rèn)值是10;D是小數(shù)點(diǎn)右側(cè)數(shù)字的數(shù)目。其范圍是0~30,但不得超過M。例如:DECIMAL(6,3),6 + 2 = 8字節(jié),取值范圍:-999.999 ~ 999.999(注意符號和小數(shù)點(diǎn)各占用一個字節(jié)) |
- 對于DECIMAL類型,Mysql5.0或者更高版本將數(shù)字打包保存到一個二進(jìn)制字符串中(每4個字節(jié)存9個數(shù)字)。例如DECIMAL(18,9)小數(shù)兩邊各存儲9個數(shù)字,一共使用9個字節(jié):小數(shù)點(diǎn)前面4個字節(jié),小數(shù)點(diǎn)本身一個字節(jié),小數(shù)點(diǎn)后面4個字節(jié)。
- 浮點(diǎn)類型(FLOAT、DOUBLE)在存儲同樣范圍的值時,通常比DECIMAL使用更少空間。所以應(yīng)該盡量只對小數(shù)進(jìn)行精確計(jì)算時才使用DECIMAL(例如財務(wù)數(shù)據(jù))。
日期與時間
| 類型 | 空間 | 說明(默認(rèn)有符號) |
|---|---|---|
| YEAR | 1字節(jié) | 年份,格式:YYYY,范圍:1901 ~ 2155 |
| TIME | 3字節(jié) | 時分秒,格式:HH:MM:SS,范圍:-838:59:59 ~ 838:59:59 |
| DATE | 3字節(jié) | 年月日,格式:YYYY-MM-DD,范圍:1000-01-01 ~ 9999-12-3 |
| DATETIME | 8字節(jié) | 年月日 時分秒,格式:YYYY-MM-DD HH:MM:SS,范圍:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
| TIMESTAMP | 4字節(jié) | 年月日 時分秒(跟時區(qū)相關(guān),按照UTC格式保存),格式:YYYY-MM-DD HH:MM:SS,范圍:1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
字符串
| 類型 | 空間 | 說明(默認(rèn)有符號) |
|---|---|---|
| CHAR | 最多255個字符 | 固定長度 |
| VARCHAR | 最多65 535個字符 | 可變長度 |
| TINYTEXT | 最多255個字符 | 短文本 |
| TEXT | 最多65 535個字符 | 文本 |
| MEDIUMTEXT | 最多16 777 215個字符 | 中等長度文本 |
| LONGTEXT | 最多4 294 967 295個字符 | 超長文本 |
| TINYBLOB | 最多255個字節(jié) | 短二進(jìn)制字符串 |
| BLOB | 最多65 535個字節(jié) | 二進(jìn)制字符串 |
| MEDIUMBLOB | 最多16 777 215個字節(jié) | 中等長度二進(jìn)制字符串 |
| LONGBLOB | 最多4 294 967 295個字節(jié) | 超長二進(jìn)制字符串 |
-
CHAR與VARCHAR
- CHAR
- 是定長的,一開始分配固定的空間,不容易產(chǎn)生碎片;
- 當(dāng)存儲CHAR時,Mysql會刪除所有的末尾空格;
- 適合存儲很短且所有值長度接近的字符串;
- VARCHAR
- 是可變長度的,比定長類型更節(jié)省空間;
- VARCHAR = ‘1(值長度<=255)或2(值長度>255)個字節(jié)記錄字符串長度’ + ‘值長度’;
- update操作時,有可能讓值變長,會導(dǎo)致額外的工作(在頁沒有更多空間可以存儲的時候,不同存儲引擎處理方式是不一樣的,例如MyISAM會將行拆成不同的片段存儲,InnoDB采用頁分裂方式);
- 指定大小不能過長,例如:使用VARCHAR(5)和VARCHAR(200)磁盤存儲‘hello’的空間開銷是一樣的,但是更長的列會消耗更多的內(nèi)存,因?yàn)镸ySql通常會按照指定的大小分配內(nèi)存。
- CHAR
-
BLOB與TEXT
BLOB和TEXT都是為存儲很大數(shù)據(jù)而設(shè)計(jì)的字符串?dāng)?shù)據(jù)類型,分別采用二進(jìn)制和字符串方式存儲。與其他類型不同,MySql把每個BLOB和TEXT值當(dāng)做一個獨(dú)立的對象處理。存儲引擎在存儲時,通常會做特殊處理。比如當(dāng)BLOB和TEXT值太大,InnoDB會使用外部存儲區(qū)域來存儲,列只需要存儲1~4個字節(jié)的指針,指針指向外部存儲區(qū)域的值。
- BLOB:分為TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB;沒有排序規(guī)則和字符集;
- TEXT:分為TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT;有排序規(guī)則和字符集。
位類型
| 類型 | 空間 | 說明 |
|---|---|---|
| BIT | BIT(n),n <= 64,n位 | 取值范圍:0 ~ 2^n - 1 |
BIT(1)或者BIT,可以用來存儲java語言中的boolean類型,1/0代表true/false。
需要注意的是,如果存儲字符串,mysql會通過字符找到ASCII碼對應(yīng)的值存儲,例如:存儲一個字符串‘1’,得到的內(nèi)容是ASCII碼字符為‘1’對應(yīng)值為49。
UPDATE users SET d = '1' WHERE id = '4';
image
image
那假設(shè)存字符串‘11’呢?UPDATE users SET d = '11' WHERE id = '4';
image
按照剛剛的邏輯可以看到,‘1’字符對應(yīng)ASCII碼值=49,二進(jìn)制表示00110001;因此‘11’,二進(jìn)制表示00110001 00110001,等于十進(jìn)制的12593.
其他類型
BINARY、VARBINARY、ENUM、SET等