柚子快報邀請碼778899分享:【MySQL】數(shù)據(jù)庫數(shù)據(jù)類型
柚子快報邀請碼778899分享:【MySQL】數(shù)據(jù)庫數(shù)據(jù)類型
文章目錄
1. 整體概要2. 數(shù)值類型(有符號) tinyint 創(chuàng)建表(無符號) tinyint 創(chuàng)建表bit類型float 類型(無符號)floatdecimal
3. 二進制類型char類型varchar類型
4. 日期時間日期時間類型
5. string 類型enum類型和set類型enum類型和set類型的查找在枚舉中的查找在set中的查找
1. 整體概要
看起來分為很多類型,例如數(shù)值類型,有一些看一眼就懂啦,所以不會全部介紹
2. 數(shù)值類型
(有符號) tinyint 創(chuàng)建表
進入 test_db數(shù)據(jù)庫中,并創(chuàng)建表t1 ,其內(nèi)部包含 tinyint類型的num
輸入 desc t1; 查看t1表結(jié)構(gòu)
tinyint類型為一個字節(jié),有符號,所以取值范圍為 -128 到 127
向t1 表中分別插入 -128 、128 、1
輸入 select * from t1; 查詢 t1 表的結(jié)構(gòu)
由于 -129 和128 超過了 tinyint類型的取值范圍,所以插入失敗
(無符號) tinyint 創(chuàng)建表
再次創(chuàng)建表,內(nèi)部包含一個無符號的 tinyint類型的num 所以取值范圍為 0 到255
輸入 desc t2; 查詢t2表的結(jié)構(gòu)
由于取值范圍是 0 到255 所以向t2表插入 0 100 255 ,可以插入成功 而向t2表插入 -1,則會插入失敗
bit類型
bit[M] :位字段類型,M表示每個值的位數(shù),范圍從1到64,如果M被忽略,默認為1
先進入 test_db 數(shù)據(jù)庫中,創(chuàng)建一張 t3表 內(nèi)部包含 int類型的id 、 1字節(jié)的online id 表示 用戶某一個身份id online 表示 當前用戶是否登錄 (1表示登錄 0表示沒有登錄)
插入 (123 ,0 ) 表示123號用戶不在線 插入 (124 ,1 ) 表示 124號用戶在線 可當插入 (123,5)時 ,由于 online 的類型為1個比特位,所以只能插入0或者1,所以會報錯
輸入 select * from t3; 即查看t3表的結(jié)構(gòu) 發(fā)現(xiàn)online 對應(yīng)的位置 什么都看不到 是因為通常以ASCII值形式顯示的,而ASCII值在當前是不可顯示的
讓 online 以十進制方案顯示出來 這樣就可以看到 0 或者 1
創(chuàng)建表時,bit范圍是1到64,而當前設(shè)置是65,所以創(chuàng)建表不成功 會報錯
float 類型
float [ (m,d) ] [unsigned] : m指定顯示長度(數(shù)字位數(shù)的總個數(shù)) d指定小數(shù)位數(shù) 占用空間4個字節(jié)
創(chuàng)建一張表t5,包含 int類型的id 以及 float類型的salary,并且salary共有4位,其中2位是小數(shù) id 表示 這個人的身份 salary 表示 這個人的工資 float [ (4,2) ] 的取值范圍是 -99.99 和 99.99
向t5表插入 (1,99.99) 和(1,-99.99) ,是可以插入成功的 (float的取值范圍是有符號區(qū)分的)
若slary為23.46,則插入成功,并且顯示為23.46
若slary為23.467,則插入成功,并且顯示為23.47 ,因為四舍五入,將其進位
若slary為23.464,則插入成功,并且顯示為23.46,因為四舍五入,將其舍去
所以進行浮點數(shù)存儲時,若要求是2位精度,而傳入更多位的精度,mysql就會采用 四舍五入的方式 將數(shù)據(jù)進行存儲
(無符號)float
mysql支持定義符號的浮點數(shù)
float [ (4,2) ] 的取值范圍為 0 到 99.99
創(chuàng)建一張表t6,內(nèi)部包含 一個bigint類型的id 以及 無符號的浮點數(shù)類型的salary,并且salary共有4位,其中2位是小數(shù)
若插入 一個99.999,正常來說小數(shù)末尾是9 是要四舍五入的,但是進位 就會超過99.99的取值范圍 ,所以會報錯
decimal
decimal (m,d) [unsigned] : 定點數(shù)m指定長度 ,d表示小數(shù)點的位數(shù)
decimal(5,2) 的取值范圍是 -999.99 - 999.99 decimal(5,2)unsigned的取值范圍是 0 - 999.99 decimal和float很像,但是有區(qū)別: float 和 decimal 表示的精度不一樣
創(chuàng)建一張表 t7 ,內(nèi)部包含 float類型的f1,f1總長度為10 ,其中小數(shù)部分為8 以及decimal 類型的f2,f2總長度為4,其中小數(shù)部分為2
當插入 99.99 在decimal的取值范圍內(nèi)時,則插入成功 當插入99.999不在decimal的取值范圍內(nèi)時,則插入失敗
將屬于t7表的 decimal類型的f2 的精度 改為 總長度為10 ,其中小數(shù)部分為8
在t7表中的成員 f1和f2中分別插入 23.12345612
輸入 select *from t7; 查看t7表的信息 發(fā)現(xiàn) f1是精度方面的問題
float在精度過大時,會進行優(yōu)化策略 但decimal不會這樣,decimal可以完全保證數(shù)據(jù)的精度
3. 二進制類型
char類型
char(L) : 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值為255
在test_db數(shù)據(jù)庫中,創(chuàng)建一張表t8 ,內(nèi)部包含 int類型的id 以及 char類型的name
輸入 desc t8; 查看t8表中更詳細信息 t8表中的name 最多儲存2個字符
向t8表中插入 一個字符’a’ 或者插入兩個字符’ab’ 時,就可以插入成功 向t8表中插入三個字符’abc’時,就會報錯
MySQL中的字符代表一種符號,一個漢字代表一個字符
當插入1個字符 中 和2個字符 中國 時,是可以插入成功的 但當插入 3個字符 中國人時 ,因為最多儲存2個字符,所以會報錯
varchar類型
varchar(L) :可變長度字符串,L表示字符串長度,最大長度為65535個字節(jié)
創(chuàng)建一張表t9,內(nèi)部包含int類型的id 和 varchar類型的name,最多儲存6個字符 并默認字符集為uft8
每一個漢字都可以看做是一個字符 若輸入 1個字符 中, 3個字符中國人 都可以插入成功 若輸入 7個字符時,就會報錯
想要修改 t9表中的name成員的varchar類型 最多儲存65536個字符 但是報錯顯示 最多 為21845 個字符 ,可明明varchar 最大長度為65535個字節(jié)
MysQL在存儲varchar類型時,是按照utf8編碼的 在uft8編碼中,一個英文字符等于1個字節(jié),一個中文等于3個字節(jié) 假設(shè)以中文計算,21845個字符 乘以3 就為 65535 個字節(jié)
char為固定長度字符串,類似于c++中的數(shù)組 如:char(6) 就表示數(shù)組字符個數(shù)為6個字符,可能只用了1個字符空間,但是依舊會給6個字符空間
varchar為變長字符串 varchar(len) len定義多大就表示字符空間的上限 如:varchar(6) 可能只用了1個字符空間,就只會分配保存一個字符空間
varchar的字節(jié)長度在0 -65535之間 ,需要有1-3個字節(jié)用于記錄數(shù)據(jù)的大小 (傳入數(shù)據(jù)的大小不同,有可能數(shù)據(jù)小 1個字節(jié)就能記錄,有可能數(shù)據(jù)太大,就需要3個字節(jié)才能記錄) 假設(shè)有3個字節(jié)記錄數(shù)據(jù),所以有效字節(jié)數(shù)為65532
當表的編碼為utf8時,varchar(len) 的參數(shù) len最大值為 65532/3=218844 (一個字符占用3個字節(jié)為例) 所以最大字符個數(shù)為 21844
創(chuàng)建一張表t10,內(nèi)部包含 varchar類型的name ,其最多儲存21845個字符 因為超過了21844范圍,所以會報錯
當表中 name的varchar類型的取值為21844時,就可以創(chuàng)建成功
4. 日期時間
日期時間類型
常用的日期如下: date:日期 ‘yyy-mm-dd’ (年月日),占用三個字節(jié) datetime: 時間日期格式 ‘yyyy-mm-dd HH: ii:ss’ (年 日 時 分 秒) 表示范圍從1000到9999,占用八個字節(jié) timestamp:時間戳 ,從1970年開始的 yyy-mm-dd HH:ii:ss (年 月 日 時 分 秒) 格式和 datetime 完全一致,占用四個字節(jié)
創(chuàng)建一張表 t10 ,內(nèi)部包含 date類型的t1 ,datetime類型的t2,timestamp類型的 t3
輸入 desc t10; 查看t10表的更多詳細信息 t3的類型為時間戳,默認值為 CURRENT_TIMESTAMP 擴展說明:創(chuàng)建表結(jié)構(gòu)時,向表中插入數(shù)據(jù),timestamp會自動更新 而date與datetime 需要外部插入
向t10表中的成員 date類型的t1 和 datetime類型的t2 分別插入 2001-10-02 和2002-10-03 08:00:00
輸入 select * from t10; 查看t10表的更詳細的信息 發(fā)現(xiàn)t3自動更新為當前時間
當輸入 update t10 set t1=‘2003-10-04’; 更新t10表中t1的時間 發(fā)現(xiàn)t3所表示的時間戳 也會跟著變化
5. string 類型
enum類型和set類型
enum:枚舉 enum(‘選項1’,‘選項2’,‘選項3’); 提供若干個選項的值,最終一個單元格中,實際只存儲其中一個值 如:問卷調(diào)查 性別 只能選男或者女
set :集合 set(‘選項1’,‘選項2’,‘選項3’); 提供若干個選項的值,最終一個單元格中,可存儲任意多個值 如:問卷調(diào)查 愛好 可以選打羽毛球 乒乓球 籃球等
創(chuàng)建一張表 votes,其中包含 最多存儲30字節(jié)的名字 、 性別 、 愛好 同時 性別 只能從男或者女中 選擇一個 而愛好 可以從 代碼 籃球 游泳中 選擇一個或者多個
向votes表中插入 姓名為 張三 性別為 男 愛 好為代碼
當性別中 插入 0 和3 是不可以的,可插入 1 和 2 是可以的
輸入 select * from votes 時,發(fā)現(xiàn) 1對應(yīng)性別男 2對應(yīng)性別女
所以使用枚舉類型,可以使用對應(yīng)的枚舉常量 也可以使用枚舉常量對應(yīng)的下標 (從1開始 分別代表第一個枚舉值 依次往后推)
向votes表中插入 姓名 為趙六 、性別為男、 愛好為 代碼、籃球、游泳 (不允許插入不存在的愛好,同時也可以選擇插入一個愛好或者多個愛好)
enum類型 與 set類型 允許為空
只插入 名字,性別與愛好會顯示為NULL NULL表示什么都沒有
’ ’ 表示有東西,但是 為空串
若set類型 對應(yīng)的愛好 插入 0 ,則顯示為空串 若set類型 對應(yīng)的愛好 插入 1 ,則顯示為第一個設(shè)置的值 ,依次類推
若set類型 對應(yīng)的愛好 插入 2,則顯示為第二個設(shè)置的值 若set類型 對應(yīng)的愛好 插入 3 ,則顯示為第一個設(shè)置的值 和第二個設(shè)置的值
因為共有3個愛好,所以設(shè)置3個比特位 000 從右到左,依次為從低到高 若表示代碼,則為 001 若表示籃球,則為 010 若表示代碼和籃球,則為011 若表示游泳,則為 100
enum類型和set類型的查找
在枚舉中的查找
輸入 select * from votes where gender=‘男’; 挑選出votes表中所有男生的信息
輸入 select * from votes where gender=‘女’; 挑選出votes表中所有女生的信息
在set中的查找
輸入 select * from votes where hobby=‘游泳’; 挑選出votes表中愛好只有游泳的人 有的人愛好是廣泛的,其中就包含游泳,但是篩選并不顯示
所以需要借助 mysql的篩選函數(shù) —— find_in_set 函數(shù)
find_in_set(sub,str,str_list):如果sub在str_list中,則返回下標,如果不在,返回0; str_list 用逗號分隔的字符串
輸入 select * frin votes where find_in_set(‘游泳’,hobby); 在votes表 的 hobby 查找所有愛好有游泳 的人
and相當于 C語言的邏輯與 在votes表 的 hobby 查找所有愛好有游泳 以及 愛好有籃球的人
柚子快報邀請碼778899分享:【MySQL】數(shù)據(jù)庫數(shù)據(jù)類型
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。