一、常見數(shù)據(jù)類型
二、數(shù)值類型
2.1 整型
- 創(chuàng)建表t1,將name列數(shù)據(jù)類型設(shè)置為要tinyint
- 插入屬性值:由于這里是tinyint類型,取值范圍是【-128–127】,當(dāng)插入這個(gè)范圍內(nèi)的數(shù)據(jù)顯示成功,范圍之外失敗
- 使用tinyint unsigned類型創(chuàng)建表t2
無符號類型取值范圍【0,255】,這點(diǎn)與C/C++一樣
2.1.1 小結(jié)
- MySQL對于數(shù)據(jù)類型不合法行為采取直接報(bào)錯(cuò),阻止我們繼續(xù)操作
- 這也說明了我們插入表里面的數(shù)據(jù)一定是合法的
- 在MySQL中,數(shù)據(jù)類型本身也是一種約束:逼著程序員合法使用,保證數(shù)據(jù)庫中的數(shù)據(jù)是可預(yù)期,完整的
- 創(chuàng)建表的時(shí)候,使用無符號類型需要在后面定義,這點(diǎn)與C/C++不同
其余整型使用方法和約束與tinyint一樣
2.2 bit類型
bit[(M)] : 位字段類型。M表示每個(gè)值的位數(shù),范圍從1到64。如果M被忽略,默認(rèn)為1。
-
創(chuàng)建表t3
-
插入數(shù)據(jù)
可以發(fā)現(xiàn)插入2的時(shí)候報(bào)錯(cuò),這是因?yàn)?無法用1個(gè)bit位表示;
查表發(fā)現(xiàn),gender沒有顯示任何屬性,這是因?yàn)閎it類型的數(shù)據(jù)默認(rèn)以ASCLL碼顯示,但是ASCLL碼0、1不可見,可以通過select id,hex(gender) from t3;
進(jìn)行十進(jìn)制查看 -
修改列的屬性
-
修改列的屬性
將gender列bit位改為10位,插入
對比之下可以發(fā)現(xiàn):bit字段在顯示時(shí),是按照ASCII碼對應(yīng)的值顯示
2.3 float 類型
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數(shù)位數(shù),占用空間4個(gè)字節(jié)
小數(shù):float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時(shí)會(huì)進(jìn)行四舍五入。
這里我創(chuàng)建了一個(gè)表t4:要求其salary字段是float類型,并且顯示長度為4,小數(shù)位數(shù)為2
無符號測試
這里我在表t4的基礎(chǔ)上增加一個(gè)字段aneno,并將其設(shè)置為無符號float類型
通過上圖可以發(fā)現(xiàn)。無符號類型的float,負(fù)數(shù)是無法插入的
2.4 decimal類型—精度更高
decimal(m, d) [unsigned] : 定點(diǎn)數(shù)m指定長度,d表示小數(shù)點(diǎn)的位數(shù)
decimal使用方法和限制條件與float一樣,唯一不同的就是精度方面
float表示的精度大約是7位
decimal整數(shù)最大位數(shù)m為65。支持小數(shù)最大位數(shù)d是30。如果d被省略,默認(rèn)為0.如果m被省略,
默認(rèn)是10。(不同平臺(tái)精度或許不用,僅供參考)
三、字符串類型
3.1 char—固定字符串
char(L): 固定長度字符串,L是可以存儲(chǔ)的長度,單位為字符,最大長度值可以為255
創(chuàng)建一個(gè)表t5將其name字段設(shè)置為兩個(gè)字符,插入英文字符與中文字符實(shí)驗(yàn)結(jié)果如下
結(jié)論:
- char數(shù)據(jù)類型本身與前面幾種一樣帶有約束(越界報(bào)錯(cuò))
- 與C/C++語言中一個(gè)字符占一個(gè)字節(jié)不一樣,在GBK中一個(gè)漢字占兩個(gè)字節(jié),UTF-8中一個(gè)漢字占三個(gè)字節(jié),但是 在mysql中,一個(gè)漢字就是一個(gè)字符
- 由于char固定長度最大為255,建表的時(shí)候超過這個(gè)數(shù)會(huì)直接報(bào)錯(cuò)
3.2 varchar—變長字符串
varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個(gè)字節(jié),在不同編碼中,L的最大長度不同,utf-8中最大是是21845
創(chuàng)建表t7,name字段設(shè)置為4個(gè)字符,使用方法和char一樣
- varchar長度可以指定為0到65535之間的值,但是有1 - 3 個(gè)字節(jié)用于記錄數(shù)據(jù)大小,所以說有效字
節(jié)數(shù)是65532。 - 當(dāng)我們的表的編碼是utf8時(shí),varchar(n)的參數(shù)n最大值是65532/3=21844[因?yàn)閡tf中,一個(gè)字符占
用3個(gè)字節(jié)],如果編碼是gbk,varchar(n)的參數(shù)n最大是65532/2=32766(因?yàn)間bk中,一個(gè)字符
占用2字節(jié)) - 表的一行也有長度限制如果一行中有其他字段,那么varchar就不能設(shè)置為最大值
3.2.1 char和varchar區(qū)別
根據(jù)需求,合理選擇char/varchar
如果數(shù)據(jù)確定長度都一樣,就使用定長(char),比如:身份證,手機(jī)號,md5(密碼摘要)
如果數(shù)據(jù)長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進(jìn)去。
定長的磁盤空間比較浪費(fèi),但是效率高。
變長的磁盤空間比較節(jié)省,但是效率低。
定長的意義是,直接開辟好對應(yīng)的空間
變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。
3.3 日期和時(shí)間類型
常用的日期有如下三個(gè):
- date :日期 ‘yyyy-mm-dd’ ,占用三字節(jié)
- datetime 時(shí)間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范圍從 1000 到 9999 ,占用八字節(jié)
- timestamp :時(shí)間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字節(jié)
創(chuàng)建表t8,帶有三個(gè)字段,分別是日期、日期時(shí)間、時(shí)間戳;前兩個(gè)字段需要傳入,時(shí)間戳不需要
更新數(shù)據(jù)或新插入數(shù)據(jù),時(shí)間戳也會(huì)被改變,如下圖
日期時(shí)間類型適用于不需要改變時(shí)間的場景:上下班打卡
時(shí)間戳類型適應(yīng)于頻繁改變時(shí)間場景:發(fā)帖子
3.4 enum和set
enum:枚舉,“單選”類型;enum(‘選項(xiàng)1’,‘選項(xiàng)2’,‘選項(xiàng)3’,…);
set:集合,“多選”類型;set(‘選項(xiàng)值1’,‘選項(xiàng)值2’,‘選項(xiàng)值3’, …);
有一個(gè)調(diào)查表,需要調(diào)查人的喜好, 比如(唱,跳,rap,籃球)中去選擇(可以多選),(男,女)[單選]
enum插入可以選擇直接用枚舉常量,也可以選擇常量下標(biāo),但是注意,枚舉常量下標(biāo)默認(rèn)從1開始;對于非枚舉常量,mysql直接報(bào)錯(cuò)
set插入特點(diǎn):可以直接用選項(xiàng)值,也可以用數(shù)字,但是插入的數(shù)據(jù)必須是集合里面的
使用數(shù)字進(jìn)行插入,結(jié)合linux權(quán)限理解
這個(gè)數(shù)字使用位圖來表示的,比如以上愛好中全選對應(yīng)的位圖結(jié)構(gòu)就是1111(15)
3.4.1 set查詢----find_in_set
find_in_set(sub,str_list) :如果 sub 在 str_list 中,則返回下標(biāo);如果不在,返回0;
str_list 用逗號分隔的字符串。
絕對查詢:結(jié)果是只含有特定字段的信息,如:select * from t9 where hobby='唱';
文章來源:http://www.zghlxwxcb.cn/news/detail-544787.html
查詢包含有特定字段的的信息文章來源地址http://www.zghlxwxcb.cn/news/detail-544787.html
到了這里,關(guān)于【MySQL】數(shù)據(jù)庫中這么多數(shù)據(jù)類型你真的了解嗎?一文看懂不同數(shù)據(jù)類型有何區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!