1. 整體概要

看起來分為很多類型,例如數值類型,有一些看一眼就懂啦,所以不會全部介紹
2. 數值類型

(有符號) tinyint 創(chuàng)建表

進入 test_db數據庫中,并創(chuàng)建表t1 ,其內部包含 tinyint類型的num

輸入 desc t1; 查看t1表結構
tinyint類型為一個字節(jié),有符號,所以取值范圍為 -128 到 127

向t1 表中分別插入 -128 、128 、1

輸入 select * from t1; 查詢 t1 表的結構

由于 -129 和128 超過了 tinyint類型的取值范圍,所以插入失敗
(無符號) tinyint 創(chuàng)建表

再次創(chuàng)建表,內部包含一個無符號的 tinyint類型的num
所以取值范圍為 0 到255

輸入 desc t2; 查詢t2表的結構

由于取值范圍是 0 到255
所以向t2表插入 0 100 255 ,可以插入成功
而向t2表插入 -1,則會插入失敗
bit類型
bit[M] :位字段類型,M表示每個值的位數,范圍從1到64,如果M被忽略,默認為1

先進入 test_db 數據庫中,創(chuàng)建一張 t3表
內部包含 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表的結構
發(fā)現online 對應的位置 什么都看不到
是因為通常以ASCII值形式顯示的,而ASCII值在當前是不可顯示的

讓 online 以十進制方案顯示出來
這樣就可以看到 0 或者 1

創(chuàng)建表時,bit范圍是1到64,而當前設置是65,所以創(chuàng)建表不成功 會報錯
float 類型
float [ (m,d) ] [unsigned] : m指定顯示長度(數字位數的總個數) d指定小數位數 占用空間4個字節(jié)

創(chuàng)建一張表t5,包含 int類型的id 以及 float類型的salary,并且salary共有4位,其中2位是小數
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,因為四舍五入,將其舍去
所以進行浮點數存儲時,若要求是2位精度,而傳入更多位的精度,mysql就會采用 四舍五入的方式 將數據進行存儲
(無符號)float
mysql支持定義符號的浮點數

float [ (4,2) ] 的取值范圍為 0 到 99.99
創(chuàng)建一張表t6,內部包含 一個bigint類型的id 以及 無符號的浮點數類型的salary,并且salary共有4位,其中2位是小數

若插入 一個99.999,正常來說小數末尾是9 是要四舍五入的,但是進位 就會超過99.99的取值范圍 ,所以會報錯
decimal
decimal (m,d) [unsigned] : 定點數m指定長度 ,d表示小數點的位數
decimal(5,2) 的取值范圍是 -999.99 - 999.99
decimal(5,2)unsigned的取值范圍是 0 - 999.99
decimal和float很像,但是有區(qū)別:
float 和 decimal 表示的精度不一樣

創(chuàng)建一張表 t7 ,內部包含 float類型的f1,f1總長度為10 ,其中小數部分為8
以及decimal 類型的f2,f2總長度為4,其中小數部分為2

當插入 99.99 在decimal的取值范圍內時,則插入成功
當插入99.999不在decimal的取值范圍內時,則插入失敗

將屬于t7表的 decimal類型的f2 的精度 改為 總長度為10 ,其中小數部分為8

在t7表中的成員 f1和f2中分別插入 23.12345612
輸入 select *from t7; 查看t7表的信息 發(fā)現 f1是精度方面的問題
float在精度過大時,會進行優(yōu)化策略
但decimal不會這樣,decimal可以完全保證數據的精度
3. 二進制類型
char類型
char(L) : 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值為255

在test_db數據庫中,創(chuàng)建一張表t8 ,內部包含 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,內部包含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é)
假設以中文計算,21845個字符 乘以3 就為 65535 個字節(jié)
char為固定長度字符串,類似于c++中的數組
如:char(6) 就表示數組字符個數為6個字符,可能只用了1個字符空間,但是依舊會給6個字符空間
varchar為變長字符串
varchar(len) len定義多大就表示字符空間的上限
如:varchar(6) 可能只用了1個字符空間,就只會分配保存一個字符空間
varchar的字節(jié)長度在0 -65535之間 ,需要有1-3個字節(jié)用于記錄數據的大小
(傳入數據的大小不同,有可能數據小 1個字節(jié)就能記錄,有可能數據太大,就需要3個字節(jié)才能記錄)
假設有3個字節(jié)記錄數據,所以有效字節(jié)數為65532
當表的編碼為utf8時,varchar(len) 的參數 len最大值為 65532/3=218844
(一個字符占用3個字節(jié)為例)
所以最大字符個數為 21844

創(chuàng)建一張表t10,內部包含 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 ,內部包含 date類型的t1 ,datetime類型的t2,timestamp類型的 t3

輸入 desc t10; 查看t10表的更多詳細信息
t3的類型為時間戳,默認值為 CURRENT_TIMESTAMP
擴展說明:創(chuàng)建表結構時,向表中插入數據,timestamp會自動更新
而date與datetime 需要外部插入

向t10表中的成員 date類型的t1 和 datetime類型的t2 分別插入 2001-10-02 和2002-10-03 08:00:00
輸入 select * from t10; 查看t10表的更詳細的信息
發(fā)現t3自動更新為當前時間

當輸入 update t10 set t1=‘2003-10-04’; 更新t10表中t1的時間
發(fā)現t3所表示的時間戳 也會跟著變化
5. string 類型
enum類型和set類型
enum:枚舉
enum(‘選項1’,‘選項2’,‘選項3’);
提供若干個選項的值,最終一個單元格中,實際只存儲其中一個值
如:問卷調查 性別 只能選男或者女
set :集合
set(‘選項1’,‘選項2’,‘選項3’);
提供若干個選項的值,最終一個單元格中,可存儲任意多個值
如:問卷調查 愛好 可以選打羽毛球 乒乓球 籃球等

創(chuàng)建一張表 votes,其中包含 最多存儲30字節(jié)的名字 、 性別 、 愛好
同時 性別 只能從男或者女中 選擇一個
而愛好 可以從 代碼 籃球 游泳中 選擇一個或者多個

向votes表中插入 姓名為 張三 性別為 男 愛 好為代碼

當性別中 插入 0 和3 是不可以的,可插入 1 和 2 是可以的

輸入 select * from votes 時,發(fā)現 1對應性別男 2對應性別女
所以使用枚舉類型,可以使用對應的枚舉常量
也可以使用枚舉常量對應的下標 (從1開始 分別代表第一個枚舉值 依次往后推)

向votes表中插入 姓名 為趙六 、性別為男、 愛好為 代碼、籃球、游泳
(不允許插入不存在的愛好,同時也可以選擇插入一個愛好或者多個愛好)
enum類型 與 set類型 允許為空

只插入 名字,性別與愛好會顯示為NULL
NULL表示什么都沒有

’ ’ 表示有東西,但是 為空串
若set類型 對應的愛好 插入 0 ,則顯示為空串
若set類型 對應的愛好 插入 1 ,則顯示為第一個設置的值 ,依次類推

若set類型 對應的愛好 插入 2,則顯示為第二個設置的值
若set類型 對應的愛好 插入 3 ,則顯示為第一個設置的值 和第二個設置的值

因為共有3個愛好,所以設置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的篩選函數 —— find_in_set 函數
find_in_set(sub,str,str_list):如果sub在str_list中,則返回下標,如果不在,返回0;
str_list 用逗號分隔的字符串

輸入 select * frin votes where find_in_set(‘游泳’,hobby);
在votes表 的 hobby 查找所有愛好有游泳 的人文章來源:http://www.zghlxwxcb.cn/news/detail-713275.html

and相當于 C語言的邏輯與
在votes表 的 hobby 查找所有愛好有游泳 以及 愛好有籃球的人文章來源地址http://www.zghlxwxcb.cn/news/detail-713275.html
到了這里,關于【MySQL】數據庫數據類型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!