4. 數據類型
4.1 數據類型分類
4.2 數值類型
4.2.1 tinyint類型
數值越界測試:
創建一張新表
create table tt1(num tinyint);
插入新的數據
insert into tt1 values(1);
再插入一個越界的數據
insert into tt1 values(128); -- 越界插入,報錯
會出現下面的錯誤
ERROR 1264 (22003): Out of range value for column 'num' at row 1
再查詢的時候也只會出現沒有越界的數據
說明:
- 在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。
- 可以通過UNSIGNED來說明某個字段是無符號的
- 無符號案例
- 其他類型自己推導
注意:儘量不使用unsigned,對於int類型可能存放不下的數據,int unsigned同樣可能存放不下,與其如此,還不如設計時,將int類型提升爲bigint類型。
4.2.2 bit類型
基本語法:
bit[(M)] : 位字段類型。M表示每個值的位數,範圍從1到64。如果M被忽略,默認爲1。
舉例:
bit使用的注意事項:
-
bit字段在顯示時,是按照ASCII碼對應的值顯示。
-
如果我們有這樣的值,只存放0或1,這時可以定義bit(1)。這樣可以節省空間。
4.2.3 小數類型
4.2.3.1 float
語法:
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數位數,佔用空間4個字節
案例:
小數:float(4,2)表示的範圍是-99.99 ~ 99.99,MySQL在保存值時會進行四捨五入。
案例:
如果定義的是float(4,2) unsigned 這時,因爲把它指定爲無符號的數,範圍是 0 ~ 99.99
4.2.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。
4.3 字符串類型
4.3.1 char
語法:
char(L): 固定長度字符串,L是可以存儲的長度,單位爲字符,最大長度值可以爲255
案例(char):
說明:
char(2) 表示可以存放兩個字符,可以是字母或漢字,但是不能超過2個, 最多隻能是255
4.3.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字節)。
在編碼是utf-8的時候我們的最大值是不能超過65532/3=21844,因爲在utf-8中一個字符佔用一個三字節,爲什麼是65532呢,因爲varchar在開始的時候使用1-3字節用於記錄數據的大小。在使用gbk的時候最大的參數n是65532/2=32766,因爲在gbk中一個字符佔用兩個字節。
4.3.3 char和varcahr比較
如何選擇定長或變長字符串?- 如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5
- 如果數據長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去。
- 定長的磁盤空間比較浪費,但是效率高。
- 變長的磁盤空間比較節省,但是效率低。
4.4 日期和時間類型
常用的日期有如下三個:
- datetime 時間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示範圍從1000到9999,佔用八字節
- date:日期 ‘yyyy-mm-dd’,佔用三字節
- timestamp:時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,佔用四字節案例:
4.5 enum和set
語法:
- enum:枚舉,“單選”類型;
enum(‘選項1’,‘選項2’,‘選項3’,…);
該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;而且出於效率考慮,這些值實際存儲的是“數字”,因爲這些選項的每個選項值依次對應如下數字:1,2,3,…最多65535個;當我們添加枚舉值時,也可以添加對應的數字編號。
-
set:集合,“多選”類型;
set(‘選項值1’,‘選項值2’,‘選項值3’, …);
該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;而且出於效率考慮,這些值實際存儲的是“數字”,因爲這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,… 最多64個。
說明:不建議在添加枚舉值,集合值的時候採用數字的方式,因爲不利於閱讀。
案例:
有一個調查表votes,需要調查人的喜好, 比如(登山,游泳,籃球,武術)中去選擇(可以多選),(男,女)[單選]
插入數據: