標籤:
資料類型是指列、預存程序參數、運算式和局部變數的資料特徵,它決定了資料的儲存方式,代表了不同的資訊
類型。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在這個欄位中插
入一個Null 字元串。另外如果插入值的大小寫與集合中值的大小寫不匹配,MySQL會自動使用插入值的大小寫轉換成與
集合中大小寫一致的值。
ENUM類型在系統內部可以儲存為數字,並且從1開始用數字做索引。一個ENUM類型最多可以包含65536個元
素,其中一個元素被MySQL保留,用來儲存錯誤現的值是合法輸入,除此之外其它任何輸入都將失敗。這說明通過搜
索包含Null 字元串或對應數字索引為0的行就可以很容易地找到錯誤記錄的位置。
(2)SET類型
SET(“member", "member2″, … “member64″)
SET資料類型為指定一組預定義值中的零個或多個值提供了一種方法,這組值最多包括64個成員。值的選擇限制
為列定義中聲明的值。
SET類型與ENUM類型相似但不相同。SET類型可以從預定義的集合中取得任意數量的值。並且與ENUM類型相
同的是任何試圖在SET類型欄位中插入非預定義的值都會使 MySQL插入一個Null 字元串。如果插入一個即有合法的元
素又有非法的元素的記錄,MySQL將會保留合法的元素,除去非法的元素。
一個 SET 類型最多可以包含64項元素。在SET元素中值被儲存為一個分離的“位”序列,這些“位”表示與它相對應
的元素。“位”是建立有序元素集合的一種簡單而有效方式。並且它還去除了重複的元素,所以SET類型中不可能包
含兩個相同的元素。希望從SET類型欄位中找出非法的記錄只需尋找包含Null 字元串或二進位值為0的行。
複合資料型別的例子我們會在以後的博文中使用到,這裡不再進行舉例。
五總結
通過對每種資料類型的用途,實體儲存體,表示範圍等有一個概要的瞭解。這樣在面對具體應用時,就可以根據相
應的特來來選擇合適的資料類型,使得我們能夠爭取在滿足應用的基礎上,用較小的儲存代價換來較高的資料庫性
能。
選用資料類型的原則:
1)選擇最小的可用的類型;
2)從速度方面考慮,選擇固定的列 使用CHAR類型;
3)從節省空間的考慮,選擇動態列,使用VARCHAR類型。
高效能資料庫設計原則:
第一步:大致確定欄位的資料類型,數字,字串,時間等,比較直觀。
第二步:確定特定的類型,比如說 :數字裡有TINYINT、SMALLINT、INT、LONGINT等,選擇最合適的一個(更
小通常更好)
第三步:如有必要,請為欄位設定預設值。
當然,索引最佳化肯定是必不可少的,不過這屬於設計表完成之後的最佳化範圍了。
MySQL學習6:MySQL基礎資料型別 (Elementary Data Type)