文章目錄
- 數值類型
- tinyint類型
- bit類型
- 小數類型
- decimal
- 日期類型
- 日期和時間類型
- 字符串類型
- char
- varchar
- enum和set
數值類型
類型 | 大小 | 范圍(有符號) | 范圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點數值 |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴于M和D的值 | 依賴于M和D的值 | 小數值 |
tinyint類型
說明:
- 在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。
- 可以通過
unsigned
來說明某個字段是無符號的
例如:
注意:盡量不使用unsigned
,還不如設計時,將int類型提升為bigint
類型。
bit類型
基本語法:
bit[(M)] : 位字段類型。M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。
如果我們有這樣的值,只存放0或1,這時可以定義bit(1)。這樣可以節省空間。
小數類型
語法:
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數位數,占用空間4個字節
小數:float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時會進行四舍五入。
- 如果為無符號的
例如:
decimal
語法:
decimal(m, d) [unsigned] : 定點數m指定長度,d表示小數點的位數
- decimal(5,2) 表示的范圍是 -999.99 ~ 999.99
- decimal(5,2) unsigned 表示的范圍 0 ~ 999.99
- decimal和float很像,但是有區別:
- float和decimal表示的精度不一樣
例如:
create table t6 (id int, salary float(10, 8), salary2 decimal(10, 8));
- 發現
decimal
的精度更準確,因此如果我們希望某 個數據表示高精度,選擇decimal
。
說明:float表示的精度大約是7位。
- decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0。如果m被省略,默認是10。
建議:如果希望小數的精度高,推薦使用decimal。
日期類型
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間類型有一個有效值范圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
類型 | 大小 ( bytes) | 范圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ | YYYY-MM-DD hh:mm:ss | 混合日期和時間值 |
TIMESTAMP | 4 | ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和時間值,時間戳 |
日期和時間類型
常用的日期有如下三個:
date:日期 ‘yyyy-mm-dd’ ,占用三字節
datetime: 時間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范圍從 1000 到 9999 ,占用八字節
timestamp:時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字節
- 插入指定時間
- 時間戳
- 使用現在的時間
字符串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定長字符串 |
VARCHAR | 0-65535 bytes | 變長字符串 |
TINYBLOB | 0-255 bytes | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二進制形式的長文本數據 |
TEXT | 0-65 535 bytes | 長文本數據 |
MEDIUMBLOB | 0-16 777 215 bytes | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295 bytes | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295 bytes | 極大文本數據 |
char
語法:
char(L): 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255
說明:
char(2)
表示可以存放兩個字符,可以是字母或漢字,但是不能超過2個, 最多只能是255
varchar
語法:
varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個字節
說明:
- 關于
varchar(len)
,len到底是多大,這個len值,和表的編碼密切相關:
varchar長度可以指定為0到65535之間的值,但是有1 - 3
個字節用于記錄數據大小,所以說有效字節數是65532。
當我們的表的編碼是utf8
時,varchar(n)
的參數n最大值是65532/3=21844
(因為utf中,一個字符占用3個字節),如果編碼是gbk
,varchar(n)
的參數n最大是65532/2=32766
(因為gbk中,一個字符占用2字節)。
enum和set
語法:
enum:枚舉,“單選”類型;
enum(‘選項1’,‘選項2’,‘選項3’,…);
該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;而且出于效率考 慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,…最多65535
個;當我們添加枚舉值時,也可以添加對應的數字編號。
語法:
set:集合,“多選”類型;
set(‘選項值1’,‘選項值2’,‘選項值3’, …);
該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,… 最多64個。
說明:不建議在添加枚舉值,集合值的時候采用數字的方式,因為不利于閱讀。
例如:
- gender可以單選(enum)
- 愛好可以多選(set)
create table stu(name varchar(6), gender enum('男','女'), hobby set('寫代碼', '打羽毛球', '籃球', '跑步')
);
- 查找愛好只有寫代碼的人
- 但是不能查詢出所有愛好寫代碼的人,就可以使用
find_in_set
函數
find_in_set(sub,str_list)
:如果sub
在str_list
中,則返回下標;如果不在,返回0;str_list
用逗號分隔的字符串。
總結:
- 如果我們向mysql特定的類型中插入不合法的數據,MySQL一般都是直接攔截我們,不讓我們做對應的操作!
- 反過來,如果我們已經有數據被成功插入到mysql中了,一定插入的時候是合法的!
- 所以,mysq中,一般而言,數據類型本身也是一種:約束
- mysql是否有無符號類型呢?
- 答案是有的!但是mysql官方文檔里明確說,不建議使用無符號類型,而且會在未來的般版本中就不支持了