數(shù)據(jù)類型
01整型
類型 | 字節(jié) | 范圍(有符號(hào)) | 范圍(無符號(hào)) |
---|---|---|---|
TINYINT |
1 | -27~27-1 | 0~28-1 |
SMALLINT |
2 | -215~215-1 | 0~216-1 |
MEDIUMINT |
3 | -223~223-1 | 0~224-1 |
INT |
4 | -231~231-1 | 0~232-1 |
BIGINT |
8 | -263~263-1 | 0~264-1 |
關(guān)于范圍的計(jì)算方法:比如tinyint,有1個(gè)字節(jié),一個(gè)字節(jié)是8位号胚。計(jì)算有符號(hào)的范圍,8位有一個(gè)是符號(hào)位浸遗,剩下的7位每一位有0和1兩種取值猫胁,代表2的7次方128個(gè)數(shù),正數(shù)128跛锌,負(fù)數(shù)128個(gè)弃秆。但是為了取出一個(gè)0,正數(shù)就少了1髓帽。所以是127個(gè)正數(shù)和一個(gè)零菠赚。無符號(hào)計(jì)算,1字節(jié)有8位郑藏,代表2的8次方256個(gè)數(shù)衡查,就是從0~255。其他同理必盖。
小知識(shí):
-
如果你定義一個(gè)字段的數(shù)據(jù)類型是int(3)那么是不是說拌牲,插入的數(shù)據(jù)最大不能超過三位數(shù)呢?
其實(shí)不是的歌粥,你仍然可以插入更大的數(shù)塌忽,最大范圍仍是上表中int的范圍沒有變。int(3)中的3是顯示位數(shù)失驶,意思是查詢時(shí)土居,顯示3位數(shù),不足三位補(bǔ)零突勇,若想最前面的零也顯示装盯,要配合關(guān)鍵詞zerofill的使用。
例如:定義score時(shí)
score int(3) zerofill
甲馋。 -
無符號(hào)數(shù)據(jù)類型怎么定義埂奈?
比如聲明score時(shí)
score int unsigned
02浮點(diǎn)型
浮點(diǎn)型 | 占用字節(jié) | 范圍 |
---|---|---|
float(單精度) | 4 | -3.4E+38~3.4E+38 |
double(雙精度) | 8 | -1.8E+308~1.8E+308 |
浮點(diǎn)數(shù)聲明:
float(M,D)
double(M,D)
? M:總位數(shù)。插入的值總位數(shù)超過M會(huì)報(bào)錯(cuò)定躏。
? D:小數(shù)位數(shù)账磺,插入的值小數(shù)位數(shù)超過D不會(huì)報(bào)錯(cuò)芹敌,四舍五入處理。
注意點(diǎn):浮點(diǎn)型存的是近似值垮抗,精度有可能會(huì)丟失氏捞。例:
create table nu(
num double(20,19)
);
insert into values (1.1234567890123456789);
select * from nu ;#你會(huì)發(fā)現(xiàn)數(shù)變了,最后幾個(gè)變成了0
03定點(diǎn)數(shù)
decimal(M,D)
說明:
- 定點(diǎn)數(shù)用于保存你要嚴(yán)格保存的數(shù)據(jù)冒版,精度不會(huì)丟失液茎,例如存款。
- 定點(diǎn)數(shù)是變長(zhǎng)的辞嗡,大概每9個(gè)數(shù)字用4個(gè)字節(jié)來存儲(chǔ)捆等,定點(diǎn)之所以能保存精確的小數(shù),是因?yàn)檎麛?shù)和小數(shù)是分開儲(chǔ)存的续室,占用資源要比浮點(diǎn)數(shù)多栋烤。
- 整型、定點(diǎn)數(shù)和浮點(diǎn)數(shù)都支持顯示寬度(zerofill)和無符號(hào)數(shù)(unsigned)挺狰。
04字符型
數(shù)據(jù)庫(kù)中明郭,所有字符型只能用單引號(hào)。
數(shù)據(jù)類型 | 描述 | 長(zhǎng)度 |
---|---|---|
char(長(zhǎng)度) | 定長(zhǎng) | 最大255 |
varchar(長(zhǎng)度) | 變長(zhǎng) | 最大65535 |
tintext | 大段文本 | 28-1=255 |
text | 大段文本 | 216-1=65535 |
mediumtext | 大段文本 | 224-1 |
longtext | 大段文本 | 232-1 |
-
char(10)和varchar(10)的區(qū)別丰泊?
答:相同點(diǎn):他們最多只能保存10個(gè)字符薯定。
? 不同點(diǎn):char不回收多余的長(zhǎng)度(定長(zhǎng)),效率高趁耗,浪費(fèi)空間沉唠;
? varchar回收對(duì)于的空間(變長(zhǎng)),效率低苛败,節(jié)省空間满葛。
-
varchar理論最大長(zhǎng)度是65535字節(jié),實(shí)際卻達(dá)不到罢屈,具體長(zhǎng)度與字符編碼有關(guān)嘀韧。
例gbk編碼 , 一個(gè)字符占用2字節(jié) , 則varchar最大長(zhǎng)度是32767.
utf8編碼中 , 一個(gè)字符占用3字節(jié) , 則varchar最大長(zhǎng)度是21845
-
一條完整數(shù)據(jù)(比如一個(gè)表有id,姓名缠捌,性別锄贷。三者合在一起算一條完整數(shù)據(jù))總長(zhǎng)度不能超過65535字節(jié)。驗(yàn)證:
create table t7( name varchar(21844), #utf8下最多能存21845字符曼月,每個(gè)字符3字節(jié) age tinyint ) charset = utf8;
上述例子會(huì)報(bào)錯(cuò)谊却,是因?yàn)閡tf8下,varchar最大存21845字符(65535字節(jié))哑芹,外加tinyint炎辨,字節(jié)總長(zhǎng)度超過了65535,所以會(huì)報(bào)錯(cuò)聪姿。
-
保存大塊文本用了text碴萧,總數(shù)據(jù)長(zhǎng)度不就超過了65535字節(jié)了乙嘀?為什么不報(bào)錯(cuò)?
答:事實(shí)上破喻,大塊文本(text)不計(jì)算在總長(zhǎng)度中虎谢,一個(gè)大塊文本只用10個(gè)字節(jié)保存文本地址,文本另存他處曹质。
05枚舉
enum('A','B')
聲明舉例:sex enum('男 ','女 ')
說明:
枚舉相當(dāng)于一個(gè)集合婴噩,值只能從集合中選一個(gè),值選非集合內(nèi)的會(huì)報(bào)錯(cuò)咆繁。
-
枚舉類型是通過整數(shù)來管理的讳推,第一個(gè)值是1顶籽,第二個(gè)值是2玩般,以此類推。驗(yàn)證與應(yīng)用:
create table t8( name varchar(10), sex enum('男','女') ); # -------------------- insert into t8 values ('Tom','男')礼饱, ('Jerry',1)坏为, # 與第七行等效 ('Rose','女'); # -------------------- #再次表明枚舉是數(shù)字镊绪,只有數(shù)字才能相加匀伏,結(jié)果也是數(shù)字。
select sex+0 from t8;
select sex from t8;
3. 枚舉的優(yōu)點(diǎn):
1. 運(yùn)行速度快(數(shù)字比字符串運(yùn)算速度快)蝴韭。
2. 限制數(shù)據(jù)够颠。
3. 節(jié)省空間(一個(gè)數(shù)字就夠了,省空間)榄鉴。
## 06集合
> set
>
> set('爬山 ','游泳 ','讀書 ')
集合相當(dāng)于多項(xiàng)選擇履磨;**每一個(gè)集合都分配一個(gè)固定的數(shù)字,分配方式從左往右庆尘,按2^0^ , 2^1^ , 2^2^ , 2^3^**……例子中剃诅,爬山是2^0^=1;游泳是2^1^=2驶忌;讀書是2^2^=4矛辕。如果你插入時(shí),選擇了爬山和讀書聊品,那么結(jié)果就是5(4+1)几苍。
例子:
```mysql
create table t9(
hobby set('爬山','游泳','讀書')
);
# 證明是數(shù)字
insert into t9 values ('爬山','讀書');
select hobby+0 from t9;
無論按照什么順序插入妖胀,其顯示結(jié)果都是按照建表時(shí)的固定順序顯示的爬坑,例如你插入時(shí) insert into t9 values ('讀書','爬山');
盾计,但是顯示結(jié)果仍然是你建表時(shí)的順序,先顯示“爬山”哭尝,再顯示“讀書”剖煌。
07日期類型
數(shù)據(jù)類型 | 占用字節(jié) | 描述 |
---|---|---|
datetime | 8 | 日期時(shí)間 |
date | 3 | 日期 |
time | 3 | 時(shí)間 |
timestamp | 4 | 時(shí)間戳 |
year | 1 | 年份 |
一般比較常用的也就前兩個(gè)。
datetime的插入格式:
insert into uu values ('2015-10-12 10:00:00');
# 日期與時(shí)間插入尤泽,在上面括號(hào)內(nèi)的基礎(chǔ)上取你所需。
注意點(diǎn):
- timestamp類型和datetime類型的形式是一樣的鬼店,區(qū)別是datetime的范圍是1~9999年妇智,而timestamp是從
1970-01-01 00:00:00
~2038-1-19 11:14:07
。 - year只占用一個(gè)字節(jié)航徙,所以只能儲(chǔ)存255個(gè)年份杠袱,范圍是1901 ~ 2155楣富。
- time表示時(shí)間或時(shí)間間隔纹蝴,范圍是 -838:59:59 ~ 838:59:59。
- 其他編程語言的時(shí)間戳與數(shù)據(jù)庫(kù)的時(shí)間戳有區(qū)別兼犯,其他編程語言時(shí)間戳是從1970年1月1日0時(shí)0分0秒到現(xiàn)在的總秒數(shù)或總毫秒數(shù)萝究,是整數(shù)帆竹。但是數(shù)據(jù)庫(kù)時(shí)間戳不是秒數(shù),形式與datatime差不多秒紧,有日期熔恢,時(shí)分秒。
08布爾型
boolean型中true和false對(duì)應(yīng)0和1鹰霍;以數(shù)字的方式儲(chǔ)存。
09數(shù)據(jù)類型小測(cè)試
- 手機(jī)號(hào):char
- 電話號(hào):varchar
- 性別:char enum
- 學(xué)生年齡:tinyint unsigned
- 薪水:dicimal
- 照片:binary督勺,但一般不把照片存數(shù)據(jù)庫(kù)堵未,如果照片幾百兆渗蟹,數(shù)據(jù)庫(kù)才幾百兆,數(shù)據(jù)庫(kù)直接就滿了。一般在數(shù)據(jù)庫(kù)存照片地址。但出題這樣出武花,還是要選binary杈帐。