數據類型及表的約束
一、數據類型
下面我將對以下幾種類型進行分析:
1、數值類型
(1)bit的使用
bit[(m)]:m可以不寫,默認值爲1,m的範圍:0-64.且bit是ASCII碼的形式展示,所有我們可以遇到不可見字符。
案例:將name屬性設置爲bit(1),則其所能容納的只有0和1,我們採用臨界值比較法對其進行驗證,結果如下。
(2)tinyint的使用
tinyint[unsigned]默認爲帶符號的,表示範圍:-128-127,若爲無符號則範圍爲:0-255.
案例(1):驗證tinyint的默認範圍及默認是否帶符號。
由下述結果,我們可以得出tinyint默認範圍爲:-128-127,且爲帶符號。
案例(2):驗證tinyint unsigned的範圍
由以下結果可以得出,無符號的tinyint範圍爲:0-255.
(3)float的使用
float[(m,d)]:m指定顯示的長度,d爲指定顯示小數位的長度。且float也可以指定爲無符號(unsigned).
案例:設置salary(6,2)進行驗證。
分析salary表示的最大範圍:-9999.99-9999.99
通過以下結果,可以發現,當指定長度時,若超過範圍則無法插入成功,且MySQL在保存值時採用四捨五入的方式。
(4)decimal的使用
decimal(m,d):m爲指定顯示的長度,d爲指定顯示小數位數的長度。m被省略默認爲10,d被省略默認爲0.
decimal與float很相似,不同之處就是表示的精度不一樣,decimal表示的精度比較大,float表示的精度大概爲7位,而decimal整數位數最大爲65位,小數位數最大爲30位。
由上圖我們可以看出float和decimal的精度不同,decimal的精度比較大,若我們希望小數的精度高時就採用decimal。
、文本、二進制類型
(1)char的使用
char(L):固定長度字符串,L表示可存長度,單位:字符。最大255個字符。
(2)varchar的使用
varchar(L):可變長度字符串,L表示字符長度,最大長度爲65535個字節。與字符集的設置有關。
uft8:一個字符三個字節。
gb2312:一個字符兩個字節。
案例:char和varchar的使用
char和varchar的區別:
存儲空間比較:
實際存儲 | char(4) | Varchar(4) | char佔用字節 | varchar佔用字節 |
Abcd | Abcd | Abcd | 4*3=12 | 4*3+1=13 |
a | a | a | 4*3=12 | 1*3+1=4 |
Abcde | × | × | 數據超過長度 | 數據超過長度 |
char:定長,會造成空間浪費,但效率高。
varchar:變長,節省空間,效率相對較低。
3、時間日期類型
(1)datatime:時間日期格式,“yyyy-mm-dd HH-ii-ss”佔八個字節
(2)data:日期格式,“yyyy-mm-dd”佔三個字節
(3)timestamp:時間戳,與datatime格式相同“yyyy-mm-dd HH-ii-ss”,佔四個字節。會自動修改爲當前的數據,只要對錶中任意數據進行修改時間戳都會改爲最後修改的時間。
插入數據時,時間戳會自動填補爲當前時間。
修改數據:修改數據時,時間戳會更新爲當前時間。
4、String類型
(1)枚舉enum
enum('選項1','選項2','選項3',...);enum其實就是“單選”類型,對應界面或表單中的“單選項”的數據值。
該設定只是提供了若干個選項的值,終一個單元格中,實際只存儲了其中一個值;而且,處於效率考慮,這些值 實際存儲的是“數字”,因爲這些選項,每個選項值,一次對應如下數字:1,2,3,....多65535個。
(2)集合set
set('選項值1','選項值2','選項值3', ...);set就是“多選”類型,對應於界面或表單的“多選項”的數據值。
該設定只是提供了若干個選項的值,終一個單元格中,設計可存儲了任何其中的多個值;而且,處於效率考慮, 這些實際存儲的是“數字”,因爲這些選項,每個選項值,一次對應如下數字:1,2,4,8,16,32,....64個。
通過插入操作發現,我們只可以插入我們創建表時定義的數據,而不能插入定義之外的數據。
我們在對錶中的數據進行查詢:
由此我們可以得出在對枚舉進行查詢時可使用我們之前使用的select * from 表名 where 滿足條件的子句,而對集合進行數據查詢時要使用find_in_set來進行查詢,否則查詢不到正確的結果。
二、表的約束
真正約束字段的是數據類型,但是數據類型約束很單一,需要有一些額外的約束,更好的保證數據的合法性,從業務邏輯角度保證數據的正確性。
(1)空屬性
兩個值:null和not null,數據庫默認字段基本都是爲空(null),但在實際中,我們儘可能使之不爲空,因爲無法參加運算。
案例:創建一個表,包含學號和姓名,且都不爲空,因爲沒有學號不知道姓名,沒有姓名也不會知道學號(排除同名問題)。
插入元素時若插入空元素則會插入不成功:
(2)默認值
默認值:某一種數據會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實數據的時候,用戶可以選擇性的使用默認值。Set和enum不能指定默認值。
當數據在插入時不給定字段的值則是默認值就生效。
(3)列描述
列描述:comment,沒有實際含義,用來描述字段表示的含義,會根據表創建語句保存,用來給程序員或DBA來進行了解。
通過show我們可以看出列描述:
(4)Zerofill格式化
其實在不加zerofill的時候,int(10)中的10是沒有任何意義的,而在加了zerofill後,則顯示的10位不夠10位的用0補齊。
同樣插入10,而看到num1的值是0000000010,而num2的值時是10,這就是zerofill屬性的作用,如果寬度小於設定的寬度(這裏設置的是10),自動填充0。要注意的是,這只是後顯示的結果,在MySQL中實際存儲的還是10。爲什麼是這樣呢?我們可以用hex函數來證明。
(5)主鍵
主鍵:primary key用來唯一的約束該字段裏面的數據,不能重複,不能爲空,主鍵所在的列是整數類型;一張表中多只能有一個主鍵。
定義主鍵的三種方式:
1)創建表的時候直接在字段上指定主鍵
2)在創建表的時候,在所有字段之後,使用primary key(主鍵字段列表)來創建主鍵,如果有多個字段作爲主鍵,可以使用複合主鍵。
複合主鍵:
3)當表創建好以後,可以再次追加主鍵
刪除主鍵:alter table 表名 drop primary key不需要指定主鍵的字段,因爲主鍵是唯一的。
(6)自增長
auto_increment:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作爲邏輯主鍵。
特點:任何一個字段要做自增長,前提是本身是一個索引(key一欄有值) 自增長字段必須是整數 一張表多只能有一個自增長。
以下實例可以表明自增長只增不長,不會因爲刪除數據自增長的值而減小。
(7)唯一鍵
一張表中有往往有很多字段需要唯一性,數據不能重複,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有 多個字段需要唯一性約束的問題。
唯一鍵的本質和主鍵差不多,唯一鍵允許爲空,而且可以多個爲空,空字段不做唯一性比較。