建設(shè)科技信息+網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)
文章目錄
- 一、數(shù)據(jù)類型分類
- 二、數(shù)值類型
- 1. tinyint 類型
- 2. bit 類型
- 3. int 類型
- 4. float 類型
- 5. decimal 類型
- 三、字符串類型
- 1. char 類型
- 2. varchar 類型
- 3. char 和 varchar 比較
- 4.日期和時(shí)間類型
- 5. enum 和 set
一、數(shù)據(jù)類型分類
數(shù)據(jù)類型本質(zhì)也是一種約束!
如果插入的數(shù)據(jù)不滿足約束條件,直接終止!
換個(gè)角度,就意味著如果滿足約束條件,就允許插入。
再換個(gè)角度,就意味著給表中的數(shù)據(jù)提供了極大的確定性。
二、數(shù)值類型
如果插入的數(shù)據(jù)越界了,SQL 會(huì)直接終止!這就是數(shù)據(jù)類型約束了 SQL 的執(zhí)行。
換言之,能插入的數(shù)據(jù)一定是范圍之內(nèi)的數(shù)據(jù)。
1. tinyint 類型
tinyint [unsigned]:帶符號(hào)范圍[-128, 127],無符號(hào)范圍[0, 255]。默認(rèn)有符號(hào)
tinyint unsigned 類型:
2. bit 類型
bit[(m)]:位類型,m指定位數(shù),范圍[1,64]。若m被忽略,默認(rèn)為1
bit 字段在顯示時(shí),是按照 ASCII 碼對(duì)應(yīng)的值顯示的。
10 是控制字符。
65 對(duì)應(yīng)字符 ‘A’ 。
如果我們有這樣的值,只存放 0 或 1,這時(shí)可以定義 bit(1) 。因?yàn)檫@樣可以節(jié)省空間。
1 和 0 都是控制字符。
3. int 類型
int [unsigned]:帶符號(hào)范圍[-2^31, 2^31-1],無符號(hào)范圍[0, 2^32-1]。默認(rèn)有符號(hào)
4. float 類型
float[(m, d)] [unsigned]:m指定顯示長(zhǎng)度,d指定小數(shù)位數(shù)
float(4,2) 表示的范圍是 [-99.99, 99.99],MySQL 在保存 float 值時(shí)會(huì)進(jìn)行四舍五入。
float unsigned 類型:
float(4,2) unsigned 表示的范圍是 [0, 99.99],負(fù)數(shù)直接不讓插入。
5. decimal 類型
decimal[(m, d)] [unsigned]:m指定長(zhǎng)度,d指定小數(shù)位數(shù)
decimal(4,2) 表示的范圍是 [-99.99, 99.99],MySQL 在保存 decimal 值時(shí)會(huì)進(jìn)行四舍五入。
decimal unsigned 類型:
decimal(4,2) unsigned 表示的范圍是 [0, 99.99],負(fù)數(shù)直接不讓插入。
decimal 和 float 很像,但是有區(qū)別:兩者表示的精度不一樣,decimal 表示的精度更高。
如果希望小數(shù)的精度高,推薦使用 decimal 。
三、字符串類型
1. char 類型
char(L):固定長(zhǎng)度字符串,L是可以存儲(chǔ)的長(zhǎng)度,單位為字符。L的最大長(zhǎng)度值是255
char(2) 表示可以存放兩個(gè)字符(可以是字母或漢字),但是不能超過 2 個(gè)。
注:
?① 在概念上,字符 != 字節(jié)。
?② 在不同的編碼格式中,漢字字符所占的字節(jié)數(shù)不一定相等。
2. varchar 類型
varchar(L):可變長(zhǎng)度字符串,L表示字符長(zhǎng)度。最大長(zhǎng)度為65535個(gè)字節(jié)
說明:關(guān)于 varchar(L),L 到底是多大,跟表的編碼格式密切相關(guān)。
?① varchar 的長(zhǎng)度(字節(jié))可以指定為 [0, 65535] 之間的值,但是有 1 - 3 個(gè)字節(jié)用于記錄數(shù)據(jù)大小,所以有效字節(jié)數(shù)是 65532 。
?② 當(dāng)表的編碼是 utf8 時(shí),varchar(L) 的參數(shù) L 最大值是 65532/3=21844(因?yàn)樵?utf8 中,一個(gè)字符占用 3 個(gè)字節(jié))。如果編碼是 gbk,varchar(L) 的參數(shù) L 最大值是 65532/2=32766(因?yàn)樵?gbk 中,一個(gè)字符占用 2 個(gè)字節(jié))。
注:這里采用的默認(rèn)字符集是 utf8 。
3. char 和 varchar 比較
實(shí)際存儲(chǔ) | char(4) | varchar(4) | char占用字節(jié) | varchar占用字節(jié) |
---|---|---|---|---|
呵呵哈哈 | 呵呵哈哈 | 呵呵哈哈 | 4*3=12 | 4*3+1=13 |
嘿 | 嘿 | 嘿 | 4*3=12 | 1*3+1=4 |
嘻嘻嘻嘻嘻 | × | × | 數(shù)據(jù)超過長(zhǎng)度 | 數(shù)據(jù)超過長(zhǎng)度 |
如何選擇定長(zhǎng)或變長(zhǎng)字符串?
- 如果數(shù)據(jù)確定長(zhǎng)度都一樣,就使用定長(zhǎng)(char),比如:身份證、手機(jī)號(hào)、md5 。
- 如果數(shù)據(jù)長(zhǎng)度有變化,就使用變長(zhǎng)(varchar),但是要保證最長(zhǎng)的能存得進(jìn)去,比如:名字、地址。
- 定長(zhǎng)的磁盤空間比較浪費(fèi),但是效率高。
- 變長(zhǎng)的磁盤空間比較節(jié)省,但是效率低。
- 定長(zhǎng)的意義是,直接開辟好對(duì)應(yīng)的空間。
- 變長(zhǎng)的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。
4.日期和時(shí)間類型
常用的有如下三個(gè):
date:日期,格式為 'yyyy-mm-dd',占用三字節(jié)
datetime:時(shí)間日期,格式為 'yyyy-mm-dd HH:ii:ss',占用八字節(jié)
timestamp:時(shí)間戳,格式為 'yyyy-mm-dd HH:ii:ss',占用四字節(jié)
若插入數(shù)據(jù)時(shí)不插入 timestamp 列,則會(huì)自動(dòng)補(bǔ)上當(dāng)前的時(shí)間戳。
更新數(shù)據(jù),時(shí)間戳?xí)詣?dòng)更新成當(dāng)前的時(shí)間戳。
5. enum 和 set
enum:枚舉,“單選”類型
enum('選項(xiàng)值1', '選項(xiàng)值2', '選項(xiàng)值3', ...)
說明:
?① 該設(shè)定只是提供了若干個(gè)選項(xiàng)的值,只允許多選一。
?② 最終一個(gè)單元格中,實(shí)際只存儲(chǔ)了其中一個(gè)值,而且出于效率考慮,實(shí)際存儲(chǔ)的是數(shù)字(這些選項(xiàng)的每個(gè)選項(xiàng)值依次對(duì)應(yīng)數(shù)字 1, 2, 3, …,最多 65535 個(gè))。因此,當(dāng)我們插入枚舉值時(shí),除了可以通過選項(xiàng)值來設(shè)置之外,還可以通過數(shù)字來設(shè)置。
set:集合,“多選”類型
set('選項(xiàng)值1', '選項(xiàng)值2', '選項(xiàng)值3', ...)
說明:
?① 該設(shè)定只是提供了若干個(gè)選項(xiàng)的值,可允許多選多。
?② 最終一個(gè)單元格中,實(shí)際存儲(chǔ)了其中任意多個(gè)值,而且出于效率考慮,實(shí)際存儲(chǔ)的是數(shù)字(這些選項(xiàng)的每個(gè)選項(xiàng)值依次對(duì)應(yīng)數(shù)字 1, 2, 4, …,最多 64 個(gè))。因此,當(dāng)我們插入集合值時(shí),除了可以通過選項(xiàng)值來設(shè)置之外,還可以通過數(shù)字來設(shè)置。
?③ 集合中的每個(gè)選項(xiàng)值分別對(duì)應(yīng)一個(gè)比特位。
若插入的數(shù)據(jù)超過枚舉或集合的范圍,則不進(jìn)行插入,直接報(bào)錯(cuò)。
嚴(yán)重不建議在插入枚舉值或集合值的時(shí)候采用數(shù)字的方式,因?yàn)椴槐阌陂喿x!
enum:
通過數(shù)字的方式進(jìn)行插入或查詢。
set:
通過數(shù)字的方式進(jìn)行插入(集合中的每個(gè)選項(xiàng)值分別對(duì)應(yīng)一個(gè)比特位)。
如果對(duì)集合直接進(jìn)行查詢,只會(huì)嚴(yán)格匹配。
比如我們想查找愛好 “包含” 游泳的人的信息,但查詢結(jié)果是愛好 “只有” 游泳的人的信息,這不符合我們的要求。
對(duì)集合進(jìn)行查詢,可使用find_in_set
函數(shù)。
比如我們想查找愛好 “包含” 游泳的人的信息,可使用該函數(shù)來進(jìn)行查找。