(八)數值數據類型 SQL92標准定義了若干種基本數據類型,它們是SQL數據庫中各種數據類型的基礎。在《字符串數據類型》一文中,我們已經詳細討論了SQL92標准所定義的字符串數據類型。現在,我們來進一步討論數值數據類型。
你最好開始嘗試使用不同數據庫實現方法並在它們傳遞數據,這樣可以加深你對數值數據類型的理解。本文將給你一個數值數據類型的概要,你可以結合你的數據庫的文檔資料來學習。
在字符串、數值、datetime和interval這四種數據類型中,數值型的種類最多,約束也最多。在不同數據庫實現方法之間交換數據時,數值型的精度也最容易降低。Oracle和SQL服務器之間的實現分歧(同樣的數據類型長度不同)導致它們之間的數據傳遞過程會截短數字、改變它們的數值。因此,在移植程序前,你有必須很明確的了解兩個平台間的數據定義差異,以及危及數據精度的風險。
謹記上述警告後,讓我們看看SQL92標准的數值類型
基本數值類型
與數值有關的類型統稱為數值類型。所有的數值都有精度,精度指的是有效數字位數。有的數值還有標度值(scale value),它用來指示小數點右邊的最小有效數字位數。例如,數字1234.56的精度為6,標度值為2,可以定義為NUMERIC(6,2)。
每一個數據庫實現方法都有關於如何近似數值或者截短數值的規則。除了提供獲取數值長度和其它數值處理所需的屬性外,SQL92提供了內建函數,如加、減、乘、除等。所有的數值類型之間都可以互相比較、互相賦值。盡管實現方法不同,但是它們有一個的共同點,即它們的結果一般都保留最大精度。
NUMERIC
用法:NUMERIC(精度,標度值)
是一種精確數值類型,即它是數字的值的文字表示。(可以對該數字進行取捨或者截取以符合指定精度,標度值由預定義的規則確定。)
為了符合標度值指定的小數數字位數,捨去多余的小數部分,捨入過程采用十進制。
數字的總長度等於精度,如果標度值大於0(有小數部分),則長度加1。
小數部分的位數要符合標度值。
DECIMAL | DEC
用法:DECIMAL(精度,標度值) | DEC(精度,標度值)
是一種精確數值類型。
用十進制。
數字的總長度等於精度,如果標度值大於0(有小數部分),則長度加1。
小數部分的位數不得小於標度值,小數位數的上限由數據庫提供商設定。
INTEGER | INT
用法: INTEGER(精度)
是一種精確數值類型。
使用二進制或者十進制,這基於表示該數值的二進制位(bit)的個數(這是implementation-specific,與SMALLINT對應)。
標度值恆為0。
數據庫供應商對其定義了最大精度和最小精度。
供應商可能會提供的默認精度。
SMALLINT
用法:SMALLINT(精度)
是一種精確數值類型。
位數取捨方法與INTEGER (二進制或者十進制)相同。
標度值恆為0。
最大精度等於或者小於INTEGER的最大精度。
FLOAT
用法:FLOAT(精度)
是一種近似數值類型,即對一個指定的數值用指數形式表示出來,如1.23e-45(等於),該數值類型的取捨和截短方法大多由數據庫提供商定義。
當取捨時,使用二進制精度。
精度表示使用的最小位數,最大精度由數據庫提供商設定。
REAL
用法:REAL
是一種近似數值類型。
使用二進制精度,最大精度由數據庫提供商設定。
其默認精度必須小於DOUBLE PRECISION的默認精度。
DOUBLE PRECISION
用法: DOUBLE PRECISION
是一種近似數值類型。
使用二進制精度,最大精度由數據庫提供商設定。
其默認精度必須大於PRECISION的默認精度。
相關理論
數據庫提供商在基本數據類型的基礎上創建了你實際需要的數據類型。對數值類型來說,它可以包括同名的數據類型,如INT、REAL,也包括為了滿足特定場合或者用途而創建的新數據類型。
在我們的下一篇文章,我們將討論datetime和interval數據類型。