文章目錄
- 前言
- 1. 數值類型
- 1.1 tinyint類型
- 1.2 bit類型
- 1.3 小數類型
- 1.3.1 float
- 1.3.2 decimal
- 2. 字符串類型
- 2.1 char
- 2.2 varchar
- 2.3 char和varchar比較
- 3. 日期類型
- 4. enum和set
前言
??數據類型分類:
1. 數值類型
1.1 tinyint類型
- 在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。
- 可以通過UNSIGNED來說明某個字段是無符號的
??注意:盡量不使用unsigned,對于int類型可能存放不下的數據,int unsigned同樣可能存放不下,與其如此,還不如設計時,將int類型提升為bigint類型。
1.2 bit類型
??基本語法:
bit[(M)] : 位字段類型。M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。
??bit使用的注意事項:
- bit字段在顯示時,是按照ASCII碼對應的值顯示。
- 如果我們有這樣的值,只存放0或1,這時可以定義bit(1)。這樣可以節省空間。
1.3 小數類型
1.3.1 float
??語法:
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數位數,占用空間4個字節
??float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時會進行四舍五入。比如說先就是只能插入-99.99 ~ 99.99,但是實際上的范圍是-99.994 ~ 99.994。
1.3.2 decimal
decimal(m, d) [unsigned] : 定點數m指定長度,d表示小數點的位數
- decimal(5,2) 表示的范圍是 -999.99 ~ 999.99
- decimal(5,2) unsigned 表示的范圍 0 ~ 999.99
??decimal和float很像,但是有區別: float和decimal表示的精度不一樣。
??說明:float表示的精度大約是7位。decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0。如果m被省略,默認是10。
??建議:如果希望小數的精度高,推薦使用decimal。
2. 字符串類型
2.1 char
??語法:
char(L): 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255
??說明:char(2) 表示可以存放兩個字符,可以是字母或漢字,但是不能超過2個, 最多只能是255。在MySQL中的字符和我們之前語言層面的字符含義是不一樣的,在語言中,一個字符就是一個字節,但是在MySQL中,一個字符就是代表一個符號。 實際上一個漢字是需要占三個字節的。
2.2 varchar
??語法:
varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個字節
??關于varchar(len),len到底是多大,這個len值,和表的編碼密切相關:
- varchar長度可以指定為0到65535之間的值,但是有1 - 3 個字節用于記錄數據大小,所以說有效字節數是65532。
- 當我們的表的編碼是utf8時,varchar(n)的參數n最大值是65532/3=21844,因為utf中,一個字符占用3個字節,如果編碼是gbk,varchar(n)的參數n最大是65532/2=32766(因為gbk中,一個字符占用2字節)。
2.3 char和varchar比較
??如何選擇定長或變長字符串?
- 如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5
- 如果數據長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去。
- 定長的磁盤空間比較浪費,但是效率高。
- 變長的磁盤空間比較節省,但是效率低。
- 定長的意義是,直接開辟好對應的空間。
- 變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。
3. 日期類型
??常用的日期有如下三個:
- date :日期 ‘yyyy-mm-dd’ ,占用三字節。
- datetime 時間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范圍從 1000 到 9999 ,占用八字節。
- timestamp :時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字節。(相比較datetime,時間戳會自動更新)
??更新時間:
update 表的名字 set 元素='2024-7-4';
4. enum和set
??語法:
- enum:枚舉,“單選”類型;enum(‘選項1’,‘選項2’,‘選項3’,…);
該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,…最多65535個;當我們添加枚舉值時,也可以添加對應的數字編號。 - set:集合,“多選”類型;set(‘選項值1’,‘選項值2’,‘選項值3’, …);
該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,…最多64個。
??說明:不建議在添加枚舉值和集合值的時候采用數字的方式,因為不利于閱讀。
??集合查詢使用find_ in_ set函數: find_in_set(sub,str_list) :如果 sub 在 str_list 中,則返回下標;如果不在,返回0;str_list 用逗號分隔的字符串。
??拿上面的例子舉例:
??當出現多個選擇時,需要用and連接:
??當然也可以通過使用比特位的方式來選擇:
??籃球是第一個也就是0001,足球是第四個也就是1000,加起來就是1001,轉為十進制就是9。
??注意:在enum中是可以用下標來進行插入的(不過是從1開始)。但是在set集合中,它的下標是無法與其中的元素一一對應的,在set中是按照比特位來辨別的,比如上面我們設置了四個愛好,那么就是0000,0001(十進制為1)代表第一個愛好,0010(2)代表第二個,0011(3)代表前兩個……