怎么理解MySQL中的數(shù)據(jù)分類概念?
發(fā)表時間:2023-07-10 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本篇文章給大家?guī)淼膬?nèi)容是關(guān)于如何理解MySQL中的數(shù)據(jù)類型概念,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一、數(shù)據(jù)是什么?數(shù)據(jù)是一個信息集合,以某種數(shù)據(jù)類型保存在數(shù)據(jù)庫里。數(shù)據(jù)...
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于如何理解MySQL中的數(shù)據(jù)類型概念,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
一、數(shù)據(jù)是什么?
數(shù)據(jù)是一個信息集合,以某種數(shù)據(jù)類型保存在數(shù)據(jù)庫里。數(shù)據(jù)包括姓名、數(shù)字、貨幣、文本、圖像、小數(shù)、計算、統(tǒng)計等,幾乎涵蓋能夠想象到的任何東西。數(shù)據(jù)客戶保存為大寫、小寫或大小寫混合,數(shù)據(jù)可以被操作或修改,大多數(shù)數(shù)據(jù)在其生存周期內(nèi)不會保持不變。
數(shù)據(jù)類型用于指定列所包含數(shù)據(jù)的規(guī)則,它決定了數(shù)據(jù)保存在列里的方式,包括分配給列的寬度,以及值是否可以是字母、數(shù)字、日期和時間等。任何數(shù)據(jù)或數(shù)據(jù)的組合都有對應(yīng)的數(shù)據(jù)類型,這些數(shù)據(jù)類型用于存儲像字母、數(shù)字、日期和時間、圖像、二進(jìn)制數(shù)據(jù)等。更詳細(xì)地說,數(shù)據(jù)可以包括姓名、描述、數(shù)字、計算、圖像、圖像描述、文檔等。
數(shù)據(jù)是數(shù)據(jù)庫的意義所在,必須受到保護(hù)。數(shù)據(jù)的保護(hù)著就是數(shù)據(jù)庫管理員(DBA),但是每個數(shù)據(jù)庫用戶也有責(zé)任采取必要手段來保護(hù)數(shù)據(jù)。
二、基本數(shù)據(jù)類型
數(shù)據(jù)類型是數(shù)據(jù)本身的特征,其特性被設(shè)置到表里的字段。舉例來說,我們可以指定某個字段必須包含數(shù)字值,不允許輸入由數(shù)字或字母組成的字符串;我們也不希望在保存貨幣數(shù)值的字段里輸入字母。為數(shù)據(jù)庫里每個字段定義數(shù)據(jù)類型可以大幅減少數(shù)據(jù)庫里由于錯誤而產(chǎn)生的錯誤數(shù)據(jù)。字段定義(數(shù)據(jù)類型定義)是一種數(shù)據(jù)校驗方式,通知了每個字段里可以輸入的數(shù)據(jù)。
1.定長字符串。
定長字符串通常具有相同的長度,是使用定長數(shù)據(jù)類型保存的。下面是Sql定長字符串的標(biāo)準(zhǔn):
CHARACTER(n)
n是一個數(shù)字,定義了字段里能夠保存的最多字符數(shù)量。
有些Sql實現(xiàn)使用CHAR數(shù)據(jù)類型來保存定長數(shù)據(jù)。字母可以保存到這種數(shù)據(jù)類型里。
在定長數(shù)據(jù)類型里,通常使用空格來補(bǔ)充數(shù)量不足的字符。如果字符長度是10,而輸入的數(shù)據(jù)只有5位,那么剩余5位就會被記錄為空格。填充空格確保了字段里每個值都具有相同的長度。
PS:不要使用定長數(shù)據(jù)類型來保存長度不定的數(shù)據(jù),比如姓名,如果不恰當(dāng)?shù)厥褂枚ㄩL數(shù)據(jù)類型,可能會導(dǎo)致浪費可用空間,以及影響對不同的數(shù)據(jù)進(jìn)行精確比較。應(yīng)該使用變長數(shù)據(jù)類型來保存長度不定的字符串,從而節(jié)省數(shù)據(jù)庫空間。
2.變長字符串。
Sql支持變長字符串,也就是長度不固定的字符串。下面是Sql變長字符串的標(biāo)準(zhǔn):
CHARACTER VARYING(n)
n是一個數(shù)字,表示字段里能夠保存的最多字符數(shù)量。
常見的變長字符串?dāng)?shù)據(jù)類型有VARCHAR、VARINARY和VARCHAR2。VARCHAR是ANSI標(biāo)準(zhǔn),Microsoft Sql Server和MySql也使用它;VARINARY和VARCHAR2都是由Oracle使用的。定義為字符的字段里可以保存數(shù)字和字母,這意味著數(shù)據(jù)中可能包含數(shù)字字符。VARBINARY類似于VARCHAR和VARCHAR2,只是它包含的是長度不定的字節(jié)。這種數(shù)據(jù)類型通常被用來保存數(shù)字式數(shù)據(jù),例如圖像文件。
定長數(shù)據(jù)類型利用空格來填充字段里的空白,但變長字符串不這樣做。舉例來說,如果某個變長字段的長度定義為10,而輸入的字符串長度為5,那么這個值的總長度也就是5,這時并不會使用空格來填充字段里的空白。
3.大對象類型。
有些變長數(shù)據(jù)類型需要保存更長的數(shù)據(jù),超過了一般情況下為VARCHAR字段所保留的長度,比如現(xiàn)在常見的BLOB和TEXT數(shù)據(jù)類型。這些數(shù)據(jù)類型專門用于保存大數(shù)據(jù)集的。BLOB是二進(jìn)制大對象,它的數(shù)據(jù)是很長的二進(jìn)制字符串。BLOB適合在數(shù)據(jù)庫里存儲二進(jìn)制媒體文件,比如圖像和MP3.
TEXT數(shù)據(jù)類型是一種長字符串類型,可以被看作一個大VARCHAR字段,通常用于在數(shù)據(jù)庫里保存大字符集,比如博客站點的HTML輸入。在數(shù)據(jù)庫里保存這種類型的數(shù)據(jù)可以實現(xiàn)站點的動態(tài)更新。
4.數(shù)值類型。
數(shù)值被保存在定義為某種數(shù)值類型的字段里,一般包括NUMBER、INTERGER、REAL/DECIMAL等。
蝦米是Sql數(shù)值的標(biāo)準(zhǔn):
(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 表示小數(shù)點后面的位數(shù)。
Sql實現(xiàn)中一個通用的數(shù)值類型是NUMERIC,它符合ANSI標(biāo)準(zhǔn)。數(shù)值可以是0、正數(shù)、定點數(shù)和浮點數(shù)。下面是使用NUMERIC的一個范例:
NUMERIC(s),這個命令把字段能夠接受的最大值限制為99 999.在本書范例所涉及的數(shù)據(jù)庫實現(xiàn)總,NUMERIC都是以DECIMAL類型實現(xiàn)的。
5.小數(shù)類型。
小數(shù)類型是數(shù)值的總體長度。舉例來說,在數(shù)值定義ZDECIMZAL(4,2)里,有效位數(shù)是4,也就是說數(shù)值總位數(shù)是4.標(biāo)度是小數(shù)點后面的位數(shù),在前例中是2。如果實際數(shù)值的小數(shù)位數(shù)超過了定義的位數(shù),數(shù)值就會被四舍五入,比如34.33寫入到定義為DECIMAL(3,1)的字段時,會被四舍五入34.3。
如果數(shù)值按照如下方式被定義,其最大值就是99.99:
DECIMAL(4,2)
有效位是4,表示數(shù)值的總體長度是4;標(biāo)度是2,表示小數(shù)點后面保留2位。小數(shù)點本身并不算作一個字符。
定義為DECIMAL(4,2)的字段允許輸入的數(shù)組包括:
(1).12
(2).12.4
(3).12.44
(4).12.449
最后一個值12.449在保存到字段時會四舍五入為12.45。在這種定義,任何12.45~12.499之間的數(shù)值會被四舍五入為12.45。
6.整數(shù)。
整數(shù)是不包含小數(shù)點的數(shù)值(包括正數(shù)和負(fù)數(shù))。
下面是一些有效的整數(shù):
(1).1;
(2).0;
(3).-1;
(4).99;
(5).-99;
(6).199;
7.浮點數(shù)。
浮點數(shù)是有效位數(shù)和標(biāo)度都可變并且沒有限制的小數(shù)數(shù)值,任何有效位數(shù)和標(biāo)度都是可以的。數(shù)據(jù)類型REAL代表單精度浮點數(shù)值,而DOUBLE PRECISION表示雙精度浮點數(shù)值。單精度浮點數(shù)值的有效位數(shù)為1~21(包含),雙精度浮點數(shù)值的有效位數(shù)為22~53(包含)。下面是一些FLOAT數(shù)據(jù)類型的范例:
(1).FLOAT;
(2).FLOAT(15);
(3).FLOAT(50);
8.日期和時間類型。
日期和時間數(shù)據(jù)類型很顯然是用于保存日期和時間信息的。標(biāo)準(zhǔn)Sql支持DATETIME數(shù)據(jù)類型,它包含以下類型:
(1).DATE;
(2).TIME;
(3).DATETIME;
(4).TIMESTAMP;
DATETIME數(shù)據(jù)類型的元素包括:
(1).YEAR;
(2).MONTH;
(3).DAY;
(4).HOUR;
(5).SECOND;
ps:SECOND元素還可以再分解為幾分之一秒,其范圍是00.000~61.999,但并不是所有Sql實現(xiàn)都支持這個范圍。多出來的1.999秒是用于實現(xiàn)閏秒的。
每種Sql實現(xiàn)可能都是具有自定義的數(shù)據(jù)類型來保存日期和時間。前面介紹的數(shù)據(jù)類型和元素是每個Sql廠商都應(yīng)該遵守的標(biāo)準(zhǔn),但大多數(shù)實現(xiàn)都具有自己的數(shù)據(jù)類型來保存日期值,其形式與實際存儲方式有所不同。
日期數(shù)據(jù)一般不指定長度。稍后我們會更詳細(xì)地介紹日期類型,包括日期信息在某些實現(xiàn)里的保存方式、如何使用轉(zhuǎn)換函數(shù)操作日期和時間,并且用范例展示在實際工作中如何使用日期和時間。
9.直義字符串。
直義字符串就是一系列字符,比如姓名或電話號碼,這是有用戶或者程序明確指定的。直義字符串包含的數(shù)據(jù)與前面介紹的數(shù)據(jù)類型具有一樣的屬性,但字符串的值是已知的。列本身的值通常是不能確定的,因為每一列通常包含了字段在全部記錄里的不同值。
實際上并不需要把字段指定為直義字符串?dāng)?shù)據(jù)類型,而是指定字符串。直義字符串的范例如下所示:
(1).'Hello';
(2).45000;
(3).'45000';
(4).3.14;
(5).'November 1 ,1997';
字符型的字符串由單引號包圍,數(shù)值45000沒有單引號包圍,而第二個45000用雙引號包圍了。一般來說,字符型字符串需要使用單引號,而數(shù)值型不需要。
將一個數(shù)據(jù)類型成數(shù)值類型的過程過程術(shù)語隱式轉(zhuǎn)換。在這個過程中,數(shù)據(jù)庫會自動判斷應(yīng)該使用哪種數(shù)據(jù)類型。所以,如果一個數(shù)據(jù)沒有使用單引號包圍起來,那么Sql程序就會將其認(rèn)定為數(shù)值類型。因此,必須要特別留意數(shù)據(jù)的形式。否則,存儲結(jié)果可能會出現(xiàn)偏差,或者報錯。稍后將介紹如何在數(shù)據(jù)庫查詢里使用直義字符串。
10.NULL數(shù)據(jù)類型。
NULL值表示沒有值。NULL值在Sql里有廣泛的應(yīng)用,包括表的創(chuàng)建、查詢的搜索條件,甚至是在直義字符串。
在使用NULL數(shù)據(jù)類型時,需要明確表示相應(yīng)字段不是必須要輸入數(shù)據(jù)的。如果某個字段必須包含數(shù)據(jù),就把它設(shè)置為NOT NULL,只要字段有可能不包含數(shù)據(jù),最好就把它設(shè)置為NULL。
11.布爾值。
布爾值的取值范圍是TRUE、FlASE和NULL,用于進(jìn)行數(shù)據(jù)比較。舉例來說,在查詢中設(shè)置條件時,每個條件都會被求值,得到TRUE、FLASE或NULL。如果查詢中所有條件的值都是TRUE,數(shù)據(jù)就會被返回;如果某個條件的值是FLASE或NULL,數(shù)據(jù)就不會返回。比如下面這個范例:
WHERE NAME =‘SMITH’
這可能是查詢里的一個條件,目標(biāo)表里每行數(shù)據(jù)都是根據(jù)這個條件進(jìn)行求值。如果表里某行的NAME字段值是SMITH,條件的值就是TRUE,相應(yīng)的記錄就會被返回。
大多數(shù)數(shù)據(jù)庫實現(xiàn)并沒有一個嚴(yán)格意義上的BOOLEAN類型,而是代之以各自不同的實現(xiàn)方法。MySql用于BOOLEAN類型,但實質(zhì)上與其現(xiàn)有的TINYINT類型相同。Oracle傾向于讓用戶使用一個CHAR(1)值來代替布爾值,而Sql Server則使用BIT來代替。
12.自定義類型。
自定義類型是由用戶定義的類型,它允許用戶根據(jù)已有的數(shù)據(jù)類型來定制自己的數(shù)據(jù)類型,從而滿足數(shù)據(jù)存儲的需要。自定義類型極大的豐富了數(shù)據(jù)存儲的可能性,使開發(fā)人員在數(shù)據(jù)庫程序開發(fā)過程中具有更大的靈活性。語句CREATE TYPE用于創(chuàng)建自定義類型。
舉例來說,在MySql和Oracle中,可以像下面這樣創(chuàng)建一個類型:
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,這正是在前面創(chuàng)建的自定義類型。
13.域。
域是能夠被使用的有效數(shù)據(jù)類型的集合。域與數(shù)據(jù)相關(guān)聯(lián),從而只接受特定的數(shù)據(jù)。在域創(chuàng)建之后,我們可以向域添加約束。約束與數(shù)據(jù)類型共同發(fā)揮作用,從而進(jìn)一步限制字段能夠接受的數(shù)據(jù)。域的使用類似于自定義類型。
像下面這樣就可以創(chuàng)建域:
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);
三、小結(jié)
Sql具有多種數(shù)據(jù)類型,對于使用過其他編程語言的人來說,這些都不算陌生。數(shù)據(jù)類型允許不同類型的數(shù)據(jù)保存到數(shù)據(jù)庫,比如單個字符、小數(shù)、日期和時間。無論是使用像c這樣的第三代編程語言,還是使用關(guān)系型數(shù)據(jù)庫實現(xiàn)Sql編碼,數(shù)據(jù)類型的概念都是一樣的。當(dāng)然,不同實現(xiàn)中數(shù)據(jù)類型的名稱坑你有所不同,但其工作方式基本上是一樣的。另外,關(guān)系型數(shù)據(jù)庫管理系統(tǒng)并不是一定要實現(xiàn),ANSI標(biāo)準(zhǔn)里規(guī)定的全部數(shù)據(jù)類型才會被認(rèn)為是與ANSI兼容的,因此最好查看具體的文檔來了解尅使用的數(shù)據(jù)類型。
在考慮數(shù)據(jù)類型、長度、標(biāo)度和精度時,一定要仔細(xì)地進(jìn)行短期和長遠(yuǎn)的規(guī)劃。另外,公司制度和希望用戶以什么方式訪問數(shù)據(jù)也是要考慮的因素。開發(fā)人員應(yīng)該了解數(shù)據(jù)的本質(zhì)。以及數(shù)據(jù)在數(shù)據(jù)庫里是如何相互關(guān)聯(lián)的,從而使用恰當(dāng)?shù)臄?shù)據(jù)類型。
本篇文章只是描述了Sql的數(shù)據(jù)類型!純文字描述!本篇文章摘錄自《Sql入門經(jīng)典》。下篇文章講解Sql小白入門(三)管理數(shù)據(jù)庫對象
!
以上就是如何理解MySQL中的數(shù)據(jù)類型概念?的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。