數據庫(2)——數據類型及表的約束

數據類型及表的約束

一、數據類型

  

下面我將對以下幾種類型進行分析:

1、數值類型

(1)bit的使用

bit[(m)]:m可以不寫,默認值爲1m的範圍:0-64.bitASCII碼的形式展示,所有我們可以遇到不可見字符。

案例:將name屬性設置爲bit1),則其所能容納的只有01,我們採用臨界值比較法對其進行驗證,結果如下。

          

                    

(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.

案例:設置salary6,2)進行驗證。

分析salary表示的最大範圍:-9999.99-9999.99

通過以下結果,可以發現,當指定長度時,若超過範圍則無法插入成功,且MySQL在保存值時採用四捨五入的方式。

      

(4)decimal的使用

decimal(m,d):m爲指定顯示的長度,d爲指定顯示小數位數的長度。m被省略默認爲10d被省略默認爲0.

decimalfloat很相似,不同之處就是表示的精度不一樣,decimal表示的精度比較大,float表示的精度大概爲7位,而decimal整數位數最大爲65位,小數位數最大爲30位。

      

由上圖我們可以看出floatdecimal的精度不同,decimal的精度比較大,若我們希望小數的精度高時就採用decimal

文本、二進制類型

(1)char的使用

     charL):固定長度字符串,L表示可存長度,單位:字符。最大255個字符。

(2)varchar的使用

varcharL:可變長度字符串,L表示字符長度,最大長度爲65535個字節。與字符集的設置有關。

uft8:一個字符三個字節。

gb2312:一個字符兩個字節。

     

案例:charvarchar的使用

     

charvarchar的區別:

存儲空間比較:

實際存儲

char4

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)空屬性

兩個值:nullnot null,數據庫默認字段基本都是爲空(null),但在實際中,我們儘可能使之不爲空,因爲無法參加運算。

案例:創建一個表,包含學號和姓名,且都不爲空,因爲沒有學號不知道姓名,沒有姓名也不會知道學號(排除同名問題)。

      

插入元素時若插入空元素則會插入不成功:

          

(2)默認值

默認值:某一種數據會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實數據的時候,用戶可以選擇性的使用默認值。Setenum不能指定默認值。

     

當數據在插入時不給定字段的值則是默認值就生效。

      

(3)列描述

列描述:comment,沒有實際含義,用來描述字段表示的含義,會根據表創建語句保存,用來給程序員或DBA來進行了解。

     

通過show我們可以看出列描述:

     

(4)Zerofill格式化

其實在不加zerofill的時候,int10)中的10是沒有任何意義的,而在加了zerofill後,則顯示的10位不夠10位的用0補齊。

   

同樣插入10,而看到num1的值是0000000010,而num2的值時是10,這就是zeroll屬性的作用,如果寬度小於設定的寬度(這裏設置的是10),自動填充0。要注意的是,這只是後顯示的結果,在MySQL中實際存儲的還是10。爲什麼是這樣呢?我們可以用hex函數來證明。

                     

(5)主鍵

主鍵:primary key用來唯一的約束該字段裏面的數據,不能重複,不能爲空,主鍵所在的列是整數類型;一張表中多只能有一個主鍵。

定義主鍵的三種方式:

1)創建表的時候直接在字段上指定主鍵

          

2)在創建表的時候,在所有字段之後,使用primary key(主鍵字段列表)來創建主鍵,如果有多個字段作爲主鍵,可以使用複合主鍵。

    

複合主鍵:

     

3)當表創建好以後,可以再次追加主鍵

      

刪除主鍵:alter table 表名 drop primary key不需要指定主鍵的字段,因爲主鍵是唯一的。

               

(6)自增長

auto_increment:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作爲邏輯主鍵。

特點:任何一個字段要做自增長,前提是本身是一個索引(key一欄有值) 自增長字段必須是整數 一張表多只能有一個自增長。

    

以下實例可以表明自增長只增不長,不會因爲刪除數據自增長的值而減小。

                    

(7)唯一鍵

一張表中有往往有很多字段需要唯一性,數據不能重複,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有 多個字段需要唯一性約束的問題。

唯一鍵的本質和主鍵差不多,唯一鍵允許爲空,而且可以多個爲空,空字段不做唯一性比較。

               



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章