在表中存儲(chǔ)數(shù)據(jù)時(shí),不同類型的數(shù)據(jù)占用的空間和存儲(chǔ)的方式都不相同。接下來(lái),我們就簡(jiǎn)單認(rèn)識(shí)一下 DB2 中的各種數(shù)據(jù)類型(Data Type)。
DB2 主要分成兩類數(shù)據(jù)類型:內(nèi)置的數(shù)據(jù)類型和用戶自定義的數(shù)據(jù)類型。本節(jié)只介紹內(nèi)置類型,用戶自定義類型在 3.17.2 節(jié)介紹。
內(nèi)置數(shù)據(jù)類型主要包括數(shù)值型、文本型、日期時(shí)間型和 XML 四大類。
數(shù)值型具體劃分如圖 3.19 所示。
圖 3.19 數(shù)值型數(shù)據(jù)的種類
?
SMALLINT 稱為小整型或短整型,是兩個(gè)字節(jié)的整數(shù),精度為 5 位,其數(shù)據(jù)表示范圍從 -32,768 到 32,767。
INT 稱為整型,也可以寫(xiě)成 INTEGER,是四個(gè)字節(jié)的整數(shù),精度為 10 位,其數(shù)據(jù)表示范圍從 -2,147,483,648 到 2,147,483,647。
BIGINT 稱為大整型或長(zhǎng)整型,是八個(gè)字節(jié)的整數(shù),精度為 19 位,其數(shù)據(jù)表示范圍從 9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
REAL 稱為單精度浮點(diǎn)數(shù),是實(shí)數(shù)的 32 位近似值。數(shù)字可以為零,或者在從 -3.402E+38 到 -1.175E-37 或從 1.175E-37 到 3.402E+38 的范圍內(nèi)。
DOUBLE 稱為雙精度浮點(diǎn)數(shù),是實(shí)數(shù)的 64 位近似值。數(shù)字可以為零,或者在從 -1.79769E+308 到 -2.225E-307 或從 2.225E-307 到 1.79769E+308 的范圍內(nèi)。
DECFLOAT 稱為十進(jìn)制浮點(diǎn)數(shù),是 V9.5 中引入的新數(shù)據(jù)類型,適合于處理準(zhǔn)確的十進(jìn)制業(yè)務(wù)。它具有 DECIMAL 類型的準(zhǔn)確性,同時(shí)又具有浮點(diǎn)數(shù)的性能優(yōu)勢(shì),特別適合于在處理貨幣值相關(guān)的應(yīng)用程序中使用。
DECIMAL 稱為十進(jìn)制數(shù),是一種可以自己定義小數(shù)位數(shù)的壓縮型十進(jìn)制數(shù),也可以寫(xiě)成 DEC,NUMERIC 或者 NUM,定義這種類型的數(shù)據(jù)需要指定兩個(gè)參數(shù):DECIMAL(p,s)。p 表示數(shù)字的總長(zhǎng)度(不包括正負(fù)號(hào)和小數(shù)點(diǎn)),s 表示小數(shù)長(zhǎng)度。
DECIMAL 類型的數(shù)據(jù)可以精確地表示指定精度的小數(shù)。它所占用的存儲(chǔ)空間與第一個(gè)參數(shù),即數(shù)字的總長(zhǎng)度有關(guān),計(jì)算公式為:tranc(p/2)+1。其中 tranc 表示截取整數(shù)部分。
字符型具體劃分如 3.20 所示。
CHAR 稱為定長(zhǎng)字符串,需要指定長(zhǎng)度,如 CHAR(10)。也可以寫(xiě)成 CHARACTER( 長(zhǎng)度 )。定長(zhǎng)字符串的長(zhǎng)度介于 1 到 254 字節(jié)之間。如果沒(méi)有指定長(zhǎng)度,那么就認(rèn)為是 1 個(gè)字節(jié)。
VARCHAR 稱為變長(zhǎng)字符串,需要指定最大長(zhǎng)度,如 VARCHAR(20)。變長(zhǎng)字符串長(zhǎng)度的最大值是 32672。存儲(chǔ)變長(zhǎng)字符串時(shí),需要額外花費(fèi) 4 個(gè)字節(jié)來(lái)記錄字符串的實(shí)際長(zhǎng)度。所以,如果指定了 VARCHAR(20),每個(gè)這種類型的數(shù)據(jù)在硬盤(pán)上實(shí)際要占用 20+4=24 個(gè)字節(jié)的空間。
需要注意的是,對(duì)于變長(zhǎng)字符串的實(shí)際占用存儲(chǔ)空間量還有一個(gè)限制:數(shù)據(jù)必須適合放在單個(gè)表空間頁(yè)面上。也就是說(shuō),對(duì)于使用 4K 頁(yè)表空間的表,長(zhǎng)度不能超過(guò) 4 × 1024-4=4092 字節(jié);對(duì)于 8K 頁(yè)表空間的表,長(zhǎng)度不能超過(guò) 8 × 1024-4=8188 字節(jié);對(duì)于 16K 頁(yè)表空間的表,長(zhǎng)度不能超過(guò) 16 × 1024-4=16380 字節(jié);對(duì)于 32K 頁(yè)表空間的表,長(zhǎng)度不能超過(guò) 32 × 1024-4=32764 字節(jié),但是該數(shù)超過(guò)了 VARCHAR 的最大長(zhǎng)度 32672,所以對(duì)于 32K 頁(yè)表空間的表,最大能夠存放 32672 字節(jié)。默認(rèn)情況下表空間為 4K,所以要使用 VARCHAR 類型來(lái)存儲(chǔ)超過(guò) 4092 字節(jié)的數(shù)據(jù),就需要顯式創(chuàng)建更大頁(yè)大小的表空間。
LONG VARCHAR 稱為大型變長(zhǎng)字符串,不需要指定最大長(zhǎng)度,其最大可以存儲(chǔ) 32700 個(gè)字節(jié)。與 VARCHAR 類型不同的是,該數(shù)據(jù)類型不受表空間頁(yè)大小的限制,對(duì)于 4K 頁(yè)表空間的表,長(zhǎng)度可以超過(guò) 4092 字節(jié),只要不超過(guò) 32700 字節(jié)即可。實(shí)際在硬盤(pán)上占用的存儲(chǔ)空間為 ( 字符串長(zhǎng)度 +24),24 個(gè)字節(jié)用于記錄與該數(shù)值相關(guān)的信息。
CLOB 稱為大對(duì)象字符串,需要指定長(zhǎng)度,CLOB(n [K|M|G]),長(zhǎng)度可以是字節(jié),也可以是 K,M 或 G 等某一種單位,每個(gè) CLOB 最大可以存儲(chǔ) 2G 字節(jié)的數(shù)據(jù)。CLOB 數(shù)據(jù)并不是直接存放在表中,而是單獨(dú)存放在一個(gè)表空間中,表中存放的是一個(gè)指針,指向?qū)?yīng)的實(shí)際數(shù)據(jù)。
GRAPHIC,VARGRAPHIC,LONG GRAPHIC 和 DBCLOB 分別與前面的 CHAR,VARCHAR,LONG VARCHR 和 CLOB 對(duì)應(yīng),只是都存儲(chǔ)雙字節(jié)字符,存儲(chǔ)的長(zhǎng)度都減小一半。
BLOB 稱為二進(jìn)制大對(duì)象,也需要指定長(zhǎng)度,BLOB(n [K|M|G]),長(zhǎng)度可以是字節(jié),也可以是 K,M 或 G 等某一種單位,每個(gè) BLOB 最大可以存儲(chǔ) 2G 字節(jié)的二進(jìn)制數(shù)據(jù)。與 CLOB 一樣,表中存放的也是指針,指向?qū)嶋H的數(shù)據(jù)。BLOB 適合于存放圖片、音頻、視頻的容量非常大的內(nèi)容,DB2 本身不考慮存放的內(nèi)容是什么,只是按照二進(jìn)制的方式將數(shù)據(jù)存放起來(lái),使用的時(shí)候還需要配合相應(yīng)的函數(shù),對(duì)不同內(nèi)容的數(shù)據(jù)進(jìn)行不同的處理。
日期時(shí)間型包括 DATE,TIME 和 TIMESTAMP 三種。
DATE 稱為日期型,能夠表示的年份范圍從公元 1 年到 9999 年中的任何一天,日期型數(shù)據(jù)顯示出來(lái)是固定長(zhǎng)度的 10 位字符串,在硬盤(pán)上存儲(chǔ)需要占用 4 個(gè)字節(jié),采用的是壓縮字符串形式進(jìn)行存儲(chǔ)。
TIME 稱為時(shí)間型,能夠表示一天當(dāng)中的時(shí)、分、秒,顯示出來(lái)是固定長(zhǎng)度的 8 位字符串,在硬盤(pán)上存儲(chǔ)需要占用 3 個(gè)字節(jié),采用的也是壓縮字符串形式進(jìn)行存儲(chǔ)。
TIMESTAMP 稱為時(shí)間戳型,能夠表示年、月、日、時(shí)、分、秒,并且能夠精確到微秒級(jí)別(具體能夠精確到的位數(shù)還與計(jì)算機(jī)的硬件和操作系統(tǒng)有關(guān))。
XML 是從 DB2 V9 開(kāi)始引入的新的數(shù)據(jù)類型,能夠直接把 XML 數(shù)據(jù)作為內(nèi)容存儲(chǔ)到表中,與以往把 XML 作為大對(duì)象存儲(chǔ)不同的是,從 V9 開(kāi)始,提供了 XQuery(類似于關(guān)系數(shù)據(jù)庫(kù)中 SQL 的一種專門(mén)針對(duì) XML 的查詢語(yǔ)言)直接對(duì) XML 這種層次型的數(shù)據(jù)進(jìn)行各種操作,關(guān)于 XQuery 的簡(jiǎn)單介紹,請(qǐng)參見(jiàn)第 4 章。關(guān)于 XQuery 更詳細(xì)的介紹,可以閱讀本叢書(shū)的第二本《 DB2 深度解析——高級(jí) DBA 和開(kāi)發(fā)者篇》。
在 9.1 版本中,XML 數(shù)據(jù)是與表中數(shù)據(jù)分開(kāi)存放的,XML 數(shù)據(jù)單獨(dú)存放在一個(gè)表空間中,而從 9.5 版本開(kāi)始,長(zhǎng)度比較短的 XML 數(shù)據(jù)直接存放在表中,長(zhǎng)度很長(zhǎng)的 XML 數(shù)據(jù)單獨(dú)存放在另外的表空間中,這樣有利于提高查詢效率。
在關(guān)系數(shù)據(jù)庫(kù)中還存在一種特殊的類型:空值,用 Null 表示。如果一個(gè)值被設(shè)置為空值,表示該值不存在。空值可以放在任意的數(shù)據(jù)類型中來(lái)表示不存在。需要注意的是,空值不能參與任何的算術(shù)運(yùn)算和邏輯運(yùn)算。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
