還記得上一篇學習的內容嗎?不記得再看一看MySQL學習第五天 MySQL數據庫基本操作,溫故可以知新!
數據類型是指列、存儲過程參數、表達式和局部變量的數據特征,它決定了數據的存儲方式,代表了不同的信息類型。MySQL中常用的的數據類型包括:數值類型、日期和時間類型和字符串類型等。
一、數值類型
MySQL支持所有標准SQL中的數值類型,其中包括嚴格數據類型(INTEGER、SMALLINT、DECIMAL、NUMBERIC),以及近似數值數據類型(FLOAT、REAL、DOUBLE、PRESISION),並在此基礎上進行擴展。擴展後增加了TINYINT、MEDIUMINT、BIGINT這3種長度不同的整形,並增加了BIT類型,用來存放位數據。
(1).整型
在MySQL中支持的5個主要整數類型是TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。這些類型在很大程度上是相同的,只有它們存儲的值的大小是不相同的。
MySQL以一個可選的顯示寬度指示器的形式對SQL標准進行擴展,這樣當從數據庫檢索一個值時,可以把這個值加長到指定的長度。例如,指定一個字段的類型為INT(6),就可以保證所包含數字少於 6 個的值從數據庫中檢索出來時能夠自動地用空格填充。需要注意的是,使用一個寬度指示器不會影響字段的大小和它可以存儲的值的范圍。萬一我們需要對一個字段存儲一個超出許可范圍的數字,MySQL會根據允許范圍最接近它的一端截短後再進行存儲。還有一個比較特別的地方是,MySQL會在不合規定的值插入表前自動修改為0。
下面的表顯示了需要的每個整數類型的存儲和范圍:
上面定義的都是有符號的,當然了,也可以加上UNSIGNED關鍵字,定義成無符號的類型,那麼對應的取值范圍就要翻翻了,比如:TINYINT UNSIGNED的取值范圍為0~255。
例如我們存儲人的年齡,就是使用TINYINT UNSIGNED:
CREATE TABBLE tb1( age TINYINT UNSIGNED, );
(2).浮點型
MySQL支持的三個浮點類型是FLOAT、DOUBLE和DECIMAL類型。FLOAT數值類型用於表示單精度浮點數值,而DOUBLE數值類型用於表示雙精度浮點數值。與整數一樣,這些類型也帶有附加參數:一個顯示寬度指示器和一個小數點指示器。比如語句 FLOAT(7,3) 規定顯示的值不會超過7位數字,小數點後面帶有3位數字。對於小數點後面的位數超過允許范圍的值,MySQL會自動將它四捨五入為最接近它的值,再插入它。
DECIMAL數據類型用於精度要求非常高的計算中,這種類型允許指定數值的精度和計數方法作為選擇參數。精度在這裡指為這個值保存的有效數字的總個數,而計數方法表示小數點後數字的位數。比如語句DECIMAL(7,3) 規定了存儲的值不會超過7位數字,並且小數點後不超過3位。
下表給出了它們的存儲范圍:
我在MySQL中建立了一個表,有一列為FLOAT(5, 3);做了以下試驗:
1)插入123.45678,最後查詢得到的結果為99.999;
2)插入123.456,最後查詢結果為99.999;
3)插入12.34567,最後查詢結果為12.346;
所以,在使用浮點型的時候,還是要注意陷阱的,要以插入數據庫中的實際結果為准。
例如我們存儲工作人員的工資就是使用FLOAT(8,2) UNSIGNED:
CREATE TABBLE tb1( salary FLOAT(8,2) UNSIGNED );
二、日期時間類型
在處理日期和時間類型的值時,MySQL帶有5個不同的數據類型可供選擇。它們可以被分成簡單的日期、時間類型,和混合日期、時間類型。根據要求的精度,子類型在每個分類型中都可以使用,並且MySQL帶有內置功能可以把多樣化的輸入格式變為一個標准格式。
下表解釋了五種日期和時間類型:
1)、MySQL用DATE和YEAR類型存儲簡單的日期值,使用TIME類型存儲時間值。這些類型可以描述為字符串或不帶分隔符的整數序列。如果描述為字符串,DATE類型的值應該使用連字號作為分隔符分開,而TIME類型的值應該使用冒號作為分隔符分開。需要注意的是,沒有冒號分隔符的TIME類型值,將會被MySQL理解為持續的時間,而不是時間戳。
2)、除了日期和時間數據類型,MySQL還支持DATEYIME和TIMESTAMP這兩種混合類型。它們可以把日期和時間作為單個的值進行存儲。這兩種類型通常用於自動存儲包含當前日期和時間的時間戳,並可在需要執行大量數據庫事務和需要建立一個調試和審查用途的審計跟蹤的應用程序中發揮良好作用。如果我們對TIMESTAMP類型的字段沒有明確賦值,或是被賦與了NULL值。MySQL會自動使用系統當前的日期和時間來填充它。
例如我們存儲添加用戶的出生年月就是使用:
CREATE TABBLE tb1( brithday DATE );
三、字符串類型
MySQL提供了6個基本的字符串類型,分別為CHAR、VARCHAR、TINYTEST、TEXT、MEDIUMTEXT、LONGTEXT六種字符串類型。可以存儲的范圍從簡單的一個字符到巨大的文本塊或二進制字符串數據。
下標解釋了六種基本字符串類型:
1)、CHAR(n)和VARCHAR(n)中括號中n代表字符的個數,並不代表字節個數,所以當使用了中文的時候(UTF8)意味著可插入m個中文,但是實際會占用m*3個字節。
2)、同時CHAR和VARCHAR最大的區別就在於CHAR不管實際VALUE都會占用n個字符的空間,而VARCHAR只會占用實際字符應該占用的空間+1,並且實際空間+1<=n。
3)、超過CHAR和VARCHAR的n設置後,字符串會被截斷。
4)、CHAR在存儲的時候會截斷尾部的空格,VARCHAR和TEXT不會。
5)、VARCHAR會使用1-3個字節來存儲長度,TEXT不會。
6)、CHAR類型用於定長字符串,並且必須在圓括號內用一個大小修飾符來定義。這個大小修飾符的范圍從 0-255。比指定長度大的值將被截短,而比指定長度小的值將會用空格作填補。
例如我們存儲登錄用戶的用戶名就是使用VARCHAR(20):
CREATE TABLE tb1( username VARCHAR(20) );
實例:
我們現在來驗證上述四個字段是否能創建成功:
CREATE TABLE tb1 ( username VARCHAR(20), age TINYINT UNSIGNED, salary FLOAT(8,2) UNSIGNED, brithday DATE );
創建數據表tb1和查看數據表結構的結果為:
我們向數據表tb1中插入記錄:INSERT tb1 VALUES('Tom',22,5555.55,'1994-10-01');
執行的結果顯示為:
四、復合類型
MySQL還支持兩種復合數據類型ENUM和SET,它們擴展了SQL規范。雖然這些類型在技術上是字符串類型,但是可以被視為不同的數據類型。一個ENUM類型只允許從一個集合中取得一個值;而SET類型允許從一個集合中取得任意多個值。
(1)ENUM類型
ENUM(“member1″, "member2″, … “member65535″)
ENUM數據類型就是定義了一種枚舉,最多包含65535個不同的成員。當定義了一個ENUM的列時,該列的值限制為列定義中聲明的值。如果列聲明包含NULL屬性,則NULL將被認為是一個有效值,並且是默認值。如果聲明了NOT NULL,則列表的第一個成員是默認值。
ENUM類型因為只允許在集合中取得一個值,有點類似於單選項。在處理相互排拆的數據時容易讓人理解,比如人類的性別。ENUM類型字段可以從集合中取得一個值或使用NULL值,除此之外的輸入將會使MySQ在這個字段中插入一個空字符串。另外如果插入值的大小寫與集合中值的大小寫不匹配,MySQL會自動使用插入值的大小寫轉換成與集合中大小寫一致的值。
ENUM類型在系統內部可以存儲為數字,並且從1開始用數字做索引。一個ENUM類型最多可以包含65536個元素,其中一個元素被MySQL保留,用來存儲錯誤現的值是合法輸入,除此之外其它任何輸入都將失敗。這說明通過搜索包含空字符串或對應數字索引為0的行就可以很容易地找到錯誤記錄的位置。
(2)SET類型
SET(“member", "member2″, … “member64″)
SET數據類型為指定一組預定義值中的零個或多個值提供了一種方法,這組值最多包括64個成員。值的選擇限制為列定義中聲明的值。
SET類型與ENUM類型相似但不相同。SET類型可以從預定義的集合中取得任意數量的值。並且與ENUM類型相同的是任何試圖在SET類型字段中插入非預定義的值都會使 MySQL插入一個空字符串。如果插入一個即有合法的元素又有非法的元素的記錄,MySQL將會保留合法的元素,除去非法的元素。
一個 SET 類型最多可以包含64項元素。在SET元素中值被存儲為一個分離的“位”序列,這些“位”表示與它相對應的元素。“位”是創建有序元素集合的一種簡單而有效的方式。並且它還去除了重復的元素,所以SET類型中不可能包含兩個相同的元素。希望從SET類型字段中找出非法的記錄只需查找包含空字符串或二進制值為0的行。
復合數據類型的例子我們會在以後的博文中使用到,這裡不再進行舉例。
五、總結
通過對每種數據類型的用途,物理存儲,表示范圍等有一個概要的了解。這樣在面對具體應用時,就可以根據相應的特來來選擇合適的數據類型,使得我們能夠爭取在滿足應用的基礎上,用較小的存儲代價換來較高的數據庫性能。
選用數據類型的原則:
1)選擇最小的可用的類型;
2)從速度方面考慮,選擇固定的列 使用CHAR類型;
3)從節省空間考慮,選擇動態的列,使用VARCHAR類型。
高性能數據庫設計原則:
第一步:大致確定字段的數據類型,數字,字符串,時間等,比較直觀。
第二步:確定特定的類型,比如說 :數字裡有TINYINT、SMALLINT、INT、LONGINT等,選擇最合適的一個(更小通常更好)
第三步:如有必要,請為字段設置默認值。
當然,索引優化肯定是必不可少的,不過這屬於設計表完成之後的優化范圍了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。