如何理解MySQL中的數據類型概念


  一、數據是什么?

  數據是一個信息集合,以某種數據類型保存在數據庫里。數據包括姓名、數字、貨幣、文本、圖像、小數、計算、統計等,幾乎涵蓋能夠想象到的任何東西。數據客戶保存為大寫、小寫或大小寫混合,數據可以被操作或修改,大多數數據在其生存周期內不會保持不變。

  數據類型用於指定列所包含數據的規則,它決定了數據保存在列里的方式,包括分配給列的寬度,以及值是否可以是字母、數字、日期和時間等。任何數據或數據的組合都有對應的數據類型,這些數據類型用於存儲像字母、數字、日期和時間、圖像、二進制數據等。更詳細地說,數據可以包括姓名、描述、數字、計算、圖像、圖像描述、文檔等。

  數據是數據庫的意義所在,必須受到保護。數據的保護着就是數據庫管理員(DBA),但是每個數據庫用戶也有責任采取必要手段來保護數據。

  二、基本數據類型

  數據類型是數據本身的特征,其特性被設置到表里的字段。舉例來說,我們可以指定某個字段必須包含數字值,不允許輸入由數字或字母組成的字符串;我們也不希望在保存貨幣數值的字段里輸入字母。為數據庫里每個字段定義數據類型可以大幅減少數據庫里由於錯誤而產生的錯誤數據。字段定義(數據類型定義)是一種數據校驗方式,通知了每個字段里可以輸入的數據。

  1.定長字符串。

  定長字符串通常具有相同的長度,是使用定長數據類型保存的。下面是Sql定長字符串的標准:

  CHARACTER(n)

  n是一個數字,定義了字段里能夠保存的最多字符數量。

  有些Sql實現使用CHAR數據類型來保存定長數據。字母可以保存到這種數據類型里。

  在定長數據類型里,通常使用空格來補充數量不足的字符。如果字符長度是10,而輸入的數據只有5位,那么剩余5位就會被記錄為空格。填充空格確保了字段里每個值都具有相同的長度。

  PS:不要使用定長數據類型來保存長度不定的數據,比如姓名,如果不恰當地使用定長數據類型,可能會導致浪費可用空間,以及影響對不同的數據進行精確比較。應該使用變長數據類型來保存長度不定的字符串,從而節省數據庫空間。

  2.變長字符串。

  Sql支持變長字符串,也就是長度不固定的字符串。下面是Sql變長字符串的標准:

  CHARACTER VARYING(n)

  n是一個數字,表示字段里能夠保存的最多字符數量。

  常見的變長字符串數據類型有VARCHAR、VARINARY和VARCHAR2。VARCHAR是ANSI標准,Microsoft Sql Server和MySql也使用它;VARINARY和VARCHAR2都是由Oracle使用的。定義為字符的字段里可以保存數字和字母,這意味着數據中可能包含數字字符。VARBINARY類似於VARCHAR和VARCHAR2,只是它包含的是長度不定的字節。這種數據類型通常被用來保存數字式數據,例如圖像文件。

  定長數據類型利用空格來填充字段里的空白,但變長字符串不這樣做。舉例來說,如果某個變長字段的長度定義為10,而輸入的字符串長度為5,那么這個值的總長度也就是5,這時並不會使用空格來填充字段里的空白。

  3.大對象類型。

  有些變長數據類型需要保存更長的數據,超過了一般情況下為VARCHAR字段所保留的長度,比如現在常見的BLOB和TEXT數據類型。這些數據類型專門用於保存大數據集的。BLOB是二進制大對象,它的數據是很長的二進制字符串。BLOB適合在數據庫里存儲二進制媒體文件,比如圖像和MP3.

  TEXT數據類型是一種長字符串類型,可以被看作一個大VARCHAR字段,通常用於在數據庫里保存大字符集,比如博客站點的HTML輸入。在數據庫里保存這種類型的數據可以實現站點的動態更新。

  4.數值類型。

  數值被保存在定義為某種數值類型的字段里,一般包括NUMBER、INTERGER、REAL/DECIMAL等。

  蝦米是Sql數值的標准:

  (1).BIT(n);

  (2).BIT VARYING(n);

  (3).DECIMAL(p,s);

  (4).INTEGER;

  (5).SMALLINT;

  (6).SIGINT;

  (7).FLOAT(p,s);

  (8).DOUBLE PRECISION(P,S);

  (9).REAL(S);

  P 表示字段的最大長度。s 表示小數點后面的位數。

  Sql實現中一個通用的數值類型是NUMERIC,它符合ANSI標准。數值可以是0、正數、定點數和浮點數。下面是使用NUMERIC的一個范例

  NUMERIC(s),這個命令把字段能夠接受的最大值限制為99 999.在本書范例所涉及的數據庫實現總,NUMERIC都是以DECIMAL類型實現的。

  5.小數類型。

  小數類型是數值的總體長度。舉例來說,在數值定義ZDECIMZAL(4,2)里,有效位數是4,也就是說數值總位數是4.標度是小數點后面的位數,在前例中是2。如果實際數值的小數位數超過了定義的位數,數值就會被四舍五入,比如34.33寫入到定義為DECIMAL(3,1)的字段時,會被四舍五入34.3。

  如果數值按照如下方式被定義,其最大值就是99.99:

  DECIMAL(4,2)

  有效位是4,表示數值的總體長度是4;標度是2,表示小數點后面保留2位。小數點本身並不算作一個字符。

  定義為DECIMAL(4,2)的字段允許輸入的數組包括:

  (1).12

  (2).12.4

  (3).12.44

  (4).12.449

  最后一個值12.449在保存到字段時會四舍五入為12.45。在這種定義,任何12.45~12.499之間的數值會被四舍五入為12.45。

  6.整數。

  整數是不包含小數點的數值(包括正數和負數)。

  下面是一些有效的整數:

  (1).1;

  (2).0;

  (3).-1;

  (4).99;

  (5).-99;

  (6).199;

  7.浮點數。

  浮點數是有效位數和標度都可變並且沒有限制的小數數值,任何有效位數和標度都是可以的。數據類型REAL代表單精度浮點數值,而DOUBLE PRECISION表示雙精度浮點數值。單精度浮點數值的有效位數為1~21(包含),雙精度浮點數值的有效位數為22~53(包含)。下面是一些FLOAT數據類型的范例:

  (1).FLOAT;

  (2).FLOAT(15);

  (3).FLOAT(50);

  8.日期和時間類型。

  日期和時間數據類型很顯然是用於保存日期和時間信息的。標准Sql支持DATETIME數據類型,它包含以下類型:

  (1).DATE;

  (2).TIME;

  (3).DATETIME;

  (4).TIMESTAMP;

  DATETIME數據類型的元素包括:

  (1).YEAR;

  (2).MONTH;

  (3).DAY;

  (4).HOUR;

  (5).SECOND;

  ps:SECOND元素還可以再分解為幾分之一秒,其范圍是00.000~61.999,但並不是所有Sql實現都支持這個范圍。多出來的1.999秒是用於實現閏秒的。

  每種Sql實現可能都是具有自定義的數據類型來保存日期和時間。前面介紹的數據類型和元素是每個Sql廠商都應該遵守的標准,但大多數實現都具有自己的數據類型來保存日期值,其形式與實際存儲方式有所不同。

  日期數據一般不指定長度。稍后我們會更詳細地介紹日期類型,包括日期信息在某些實現里的保存方式、如何使用轉換函數操作日期和時間,並且用范例展示在實際工作中如何使用日期和時間。

  9.直義字符串。

  直義字符串就是一系列字符,比如姓名或電話號碼,這是有用戶或者程序明確指定的。直義字符串包含的數據與前面介紹的數據類型具有一樣的屬性,但字符串的值是已知的。列本身的值通常是不能確定的,因為每一列通常包含了字段在全部記錄里的不同值。

  實際上並不需要把字段指定為直義字符串數據類型,而是指定字符串。直義字符串的范例如下所示:

  (1).'Hello';

  (2).45000;

  (3).'45000';

  (4).3.14;

  (5).'November 1 ,1997';

  字符型的字符串由單引號包圍,數值45000沒有單引號包圍,而第二個45000用雙引號包圍了。一般來說,字符型字符串需要使用單引號,而數值型不需要。

  將一個數據類型成數值類型的過程過程術語隱式轉換。在這個過程中,數據庫會自動判斷應該使用哪種數據類型。所以,如果一個數據沒有使用單引號包圍起來,那么Sql程序就會將其認定為數值類型。因此,必須要特別留意數據的形式。否則,存儲結果可能會出現偏差,或者報錯。稍后將介紹如何在數據庫查詢里使用直義字符串。

  10.NULL數據類型。

  NULL值表示沒有值。NULL值在Sql里有廣泛的應用,包括表的創建、查詢的搜索條件,甚至是在直義字符串。

  在使用NULL數據類型時,需要明確表示相應字段不是必須要輸入數據的。如果某個字段必須包含數據,就把它設置為NOT NULL,只要字段有可能不包含數據,最好就把它設置為NULL。

  11.布爾值。

  布爾值的取值范圍是TRUE、FlASE和NULL,用於進行數據比較。舉例來說,在查詢中設置條件時,每個條件都會被求值,得到TRUE、FLASE或NULL。如果查詢中所有條件的值都是TRUE,數據就會被返回;如果某個條件的值是FLASE或NULL,數據就不會返回。比如下面這個范例:

  WHERE NAME=‘SMITH’

  這可能是查詢里的一個條件,目標表里每行數據都是根據這個條件進行求值。如果表里某行的NAME字段值是SMITH,條件的值就是TRUE,相應的記錄就會被返回。

  大多數數據庫實現並沒有一個嚴格意義上的BOOLEAN類型,而是代之以各自不同的實現方法。MySql用於BOOLEAN類型,但實質上與其現有的TINYINT類型相同。Oracle傾向於讓用戶使用一個CHAR(1)值來代替布爾值,而Sql Server則使用BIT來代替。

  12.自定義類型。

  自定義類型是由用戶定義的類型,它允許用戶根據已有的數據類型來定制自己的數據類型,從而滿足數據存儲的需要。自定義類型極大的豐富了數據存儲的可能性,使開發人員在數據庫程序開發過程中具有更大的靈活性。語句CREATE TYPE用於創建自定義類型。

  舉例來說,在MySql和Oracle中,可以像下面這樣創建一個類型:

  CREATE TYPE PERSON ASOBJECT

  (NAME VARCHER (30),

  SSN VARCHAR(9);

  )

  然后可以像下面這樣引用自定義類型:

  CREATE TABLE EMP_PAY

  (EMPLOYEE PERSON,

  SALARY DECIMAL(10,2),

  HIRE_DATE DATE);

  表EMP_PAY第一列EMPLOYEE的類型是PERSON,這正是在前面創建的自定義類型。

  13.域。

  域是能夠被使用的有效數據類型的集合。域與數據相關聯,從而只接受特定的數據。在域創建之后,我們可以向域添加約束。約束與數據類型共同發揮作用,從而進一步限制字段能夠接受的數據。域的使用類似於自定義類型。

  像下面這樣就可以創建域:

  CREATE DOMAIN MONEY_D AS NUMBER(0,2);

  像下面這樣為域添加約束:

  ALTER DOMAIN MONEy_D

  ADD CONSTRAINT MONEY_CON

  CHECK(VALUE>5);

  然后像下面這樣引用域:

  CREATE TABLE EMP_PAY

  (EMP_ID NUMBER(9),

  EMP_NAME VARCHER2(30),

  PAY_RATE MONEY_D);

  三、小結

  Sql具有多種數據類型,對於使用過其他編程語言的人來說,這些都不算陌生。數據類型允許不同類型的數據保存到數據庫,比如單個字符、小數、日期和時間。無論是使用像c這樣的第三代編程語言,還是使用關系型數據庫實現Sql編碼,數據類型的概念都是一樣的。當然,不同實現中數據類型的名稱坑你有所不同,但其工作方式基本上是一樣的。另外,關系型數據庫管理系統並不是一定要實現,ANSI標准里規定的全部數據類型才會被認為是與ANSI兼容的,因此最好查看具體的文檔來了解尅使用的數據類型。

  在考慮數據類型、長度、標度和精度時,一定要仔細地進行短期和長遠的規划。另外,公司制度和希望用戶以什么方式訪問數據也是要考慮的因素。開發人員應該了解數據的本質。以及數據在數據庫里是如何相互關聯的,從而使用恰當的數據類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM