資料庫(2)——資料型別及表的約束
資料型別及表的約束
一、資料型別
下面我將對以下幾種型別進行分析:
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的預設範圍及預設是否帶符號。
由下述結果,我們可以得出
案例(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(
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)唯一鍵
一張表中有往往有很多欄位需要唯一性,資料不能重複,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有 多個欄位需要唯一性約束的問題。
唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空欄位不做唯一性比較。