CHAR Data Type
CHAR
是用數(shù)據(jù)庫(kù)字符集定義的長(zhǎng)度固定的字符串類(lèi)型寿谴,其定義方式如下:
CHAR [ (size [ BYTE | CHAR ]) ]
中括號(hào)中的內(nèi)容是可選項(xiàng)的贴谎,size
表示字符串的長(zhǎng)度 ,BYTE
和CHAR
表示長(zhǎng)度單位高诺。BYTE
是指字符串的字節(jié)數(shù)踱讨,CHAR
是指根據(jù)數(shù)據(jù)庫(kù)字符集中的碼點(diǎn)為單位的長(zhǎng)度,也就是說(shuō)如果碼點(diǎn)是2個(gè)字節(jié)持偏,size
定義為3驼卖,那么一共就是6個(gè)字節(jié)。
如果省略長(zhǎng)度單位鸿秆,那么默認(rèn)由NLS_LENGTH_SEMANTICS
這個(gè)參數(shù)決定酌畜,一般是BYTE
。
CHAR
中存儲(chǔ)的數(shù)據(jù)具有固定長(zhǎng)度谬莹,如果長(zhǎng)度小于size
檩奠,會(huì)用空白符填充桩了。
如果省略size
,那么默認(rèn)就是1埠戳。
size
最大值為2000井誉,表示2000個(gè)字節(jié)或字符(碼點(diǎn))。由于可以存儲(chǔ)在CHAR
中的數(shù)據(jù)最大為2000字節(jié)整胃,因此如果字符集中的碼點(diǎn)大于1個(gè)字節(jié)颗圣,那么就無(wú)法存儲(chǔ)2000個(gè)字符。如果希望存儲(chǔ)任何數(shù)據(jù)庫(kù)字符集中的字符屁使,那么size必須小于等于500(一般碼點(diǎn)最多4個(gè)字節(jié))在岂。
NCHAR Data Type
NCHAR
是用國(guó)家字符集定義的長(zhǎng)度固定的字符串類(lèi)型,國(guó)家字符集可以指定為AL16UTF16或UTF8蛮寂。其定義方式如下:
NCHAR [ (size) ]
中括號(hào)中的內(nèi)容是可選項(xiàng)的蔽午,size
表示字符串的長(zhǎng)度 或者可以說(shuō)有多少個(gè)碼點(diǎn),一個(gè)碼點(diǎn)在AL16UTF16
中始終具有2個(gè)字節(jié)酬蹋,而在UTF8
中始終具有1至3個(gè)字節(jié)(UTF8
不等于UTF-8
及老,UTF8
是oracle中定義的字符集,它對(duì)應(yīng)于CESU-8
)范抓。
NCHAR
中存儲(chǔ)的數(shù)據(jù)具有固定長(zhǎng)度骄恶,如果長(zhǎng)度小于size
,會(huì)用空白符填充(如果是UTF-8
匕垫,那么字節(jié)數(shù)不一定相同)僧鲁。
如果省略size
,那么默認(rèn)就是1象泵。
當(dāng)國(guó)家字符集為AL16UTF16時(shí)
寞秃,size
最大值為1000個(gè)字符,當(dāng)國(guó)家字符集為UTF8
時(shí)单芜,size
最大值為2000個(gè)字符蜕该。但是需要注意的是NCHAR
最多只能存儲(chǔ)2000個(gè)字節(jié),因此如果你希望始終能夠存儲(chǔ)size
個(gè)國(guó)家字符集中的字符洲鸠,那么size
必須小于等于666(2000/3)堂淡。
VARCHAR2 Data Type
VARCHAR2
是數(shù)據(jù)庫(kù)字符集定義的可變長(zhǎng)的字符串類(lèi)型,其定義格式如下:
VARCHAR2 (size [ BYTE | CHAR ])
其中size
必須指定扒腕,BYTE
或CHAR
可以省略绢淀。BYTE
是指字符串的字節(jié)數(shù),CHAR
是指根據(jù)數(shù)據(jù)庫(kù)字符集中的碼點(diǎn)為單位的長(zhǎng)度瘾腰,一個(gè)碼點(diǎn)可以具有1到4個(gè)字節(jié)(這點(diǎn)跟NCHAR
不同皆的,主要是它們使用了不同的字符集)。如果未指定長(zhǎng)度單位蹋盆,默認(rèn)由NLS_LENGTH_SEMANTICS
這個(gè)參數(shù)決定费薄,一般是BYTE
硝全。
size
最小值為1,最大值為:
- 32767字節(jié)楞抡,如果
MAX_STRING_SIZE = EXTENDED
- 4000字節(jié)伟众,如果
MAX_STRING_SIZE = STANDARD
根據(jù)MAX_STRING_SIZE
的參數(shù)不同,VARCHAR2
最多能存儲(chǔ)32767或4000字節(jié)召廷。如果你希望始終能夠存儲(chǔ)size
個(gè)數(shù)據(jù)庫(kù)字符集中的字符凳厢,那么size
必須小于等于8191(32767/4,MAX_STRING_SIZE = EXTENDED
)或1000(4000/4竞慢,MAX_STRING_SIZE = STANDARD
)先紫。
VARCHAR Data Type
不要使用VARCHAR
數(shù)據(jù)類(lèi)型,請(qǐng)改用VARCHAR2
數(shù)據(jù)類(lèi)型筹煮。盡管該VARCHAR
數(shù)據(jù)類(lèi)型當(dāng)前是VARCHAR2
的同義詞遮精,但未來(lái)會(huì)重新定義。
NVARCHAR2 Data Type
NVARCHAR2
是用國(guó)家字符集定義的可變長(zhǎng)的字符串類(lèi)型寺谤,國(guó)家字符集可以指定為AL16UTF16或UTF8仑鸥。其定義方式如下:
NVARCHAR2 (size )
其中size
必須指定吮播,表示多少個(gè)字符或者更確切地說(shuō)表示多少個(gè)國(guó)家字符集中的碼點(diǎn)变屁。一個(gè)碼點(diǎn)在AL16UTF16
中始終具有2個(gè)字節(jié),而在UTF8
中始終具有1至3個(gè)字節(jié)意狠。
size
最小值為1粟关,最大值為:
- 16383
MAX_STRING_SIZE = EXTENDED
并且國(guó)家字符集為AL16UTF16 - 32767
MAX_STRING_SIZE = EXTENDED
并且國(guó)家字符集是UTF8 - 2000
MAX_STRING_SIZE = STANDARD
并且國(guó)家字符集為AL16UTF16 - 4000
MAX_STRING_SIZE = STANDARD
國(guó)家字符集為UTF8
根據(jù)MAX_STRING_SIZE
的參數(shù)不同,NVARCHAR2
最多能存儲(chǔ)32767或4000字節(jié)环戈。如果你希望始終能夠存儲(chǔ)size
個(gè)國(guó)家字符集中的字符闷板,那么size
必須小于等于10922(32767/3,MAX_STRING_SIZE = EXTENDED
院塞,國(guó)家字符集定義為UTF8
)或1333(4000/3遮晚, MAX_STRING_SIZE = STANDARD
,國(guó)家字符集定義為UTF8
)拦止。
NUMBER Data Type
NUMBER
數(shù)據(jù)類(lèi)型可以存儲(chǔ)零县遣、正定點(diǎn)數(shù)和負(fù)定點(diǎn)數(shù),絕對(duì)值取值范圍從1.0 x 10-130到1.0 x 10126汹族。其定義格式如下:
NUMBER [ (precision [, scale ]) ]
-
precision
表示精度萧求,也就是十進(jìn)制數(shù)的最大有效位。其中最高有效數(shù)字是最左邊的非零數(shù)字顶瞒,最低有效數(shù)字是最右邊的數(shù)字夸政。Oracle保證數(shù)字的可移植性,精度的取值范圍從1到38榴徐。 -
scale
表示范圍或小數(shù)位的位數(shù)守问,取值范圍從-84到127匀归。
如果scale
是正數(shù),它表示從小數(shù)點(diǎn)右邊到最低有效位的位數(shù)(包括最低有效位數(shù))耗帕。
如果scale
是負(fù)數(shù)朋譬,它表示小數(shù)點(diǎn)左邊的位數(shù)(不包括最低有效位數(shù))。最低有效數(shù)字在小數(shù)點(diǎn)的左側(cè)兴垦,因?yàn)閷?shí)際數(shù)據(jù)會(huì)四舍五入到小數(shù)點(diǎn)左側(cè)的指定位數(shù)徙赢。例如(10,-2) 表示四舍五入到100。
注:如果小數(shù)點(diǎn)左邊有效位數(shù)小于等于scale
探越,那么數(shù)據(jù)會(huì)變?yōu)?狡赐。
scale
可以比precision
大,典型的用法是帶e
符號(hào)的小數(shù)钦幔。當(dāng)scale
大于precision
時(shí)枕屉,precision
指定小數(shù)點(diǎn)右邊的最大有效位數(shù)(小數(shù)點(diǎn)左邊不可能有有效位了,因?yàn)橐坏┯械脑?code>precision必然大于scale
鲤氢,這跟這里討論的情況不一致)搀擂。例如,NUMBER(4,5)要求小數(shù)點(diǎn)后的第一位為零卷玉,并將所有值四舍五入到小數(shù)點(diǎn)后的第五位哨颂。
指定定點(diǎn)數(shù)的precision
和scale
是最佳實(shí)踐,它可以對(duì)輸入進(jìn)行額外的完整性檢查相种。定義precision
和scale
并不會(huì)強(qiáng)制所有值必須是固定長(zhǎng)度威恼。如果值超過(guò)precision
,則Oracle返回錯(cuò)誤寝并。如果值超過(guò)scale
箫措,則Oracle對(duì)其進(jìn)行四舍五入。
定義整數(shù):
NUMBER(p)
它表示定點(diǎn)數(shù)衬潦,等價(jià)于NUMBER(p,0)
斤蔓。
定義浮點(diǎn)數(shù):
NUMBER
省略precision
和scale
指示Oracle使用NUMBER
的最大范圍和精度。
FLOAT Data Type
FLOAT [ (precision) ]
FLOAT
數(shù)據(jù)類(lèi)型是NUMBER
的子類(lèi)型镀岛∠夷担可以指定precision
,也可以不指定precision
哎媚,其定義與NUMBER
的precision
相同喇伯,范圍從1到126。scale
不能被定義拨与,但是可以從數(shù)據(jù)中解釋稻据。每一個(gè)FLOAT
值需要1到22個(gè)字節(jié)。
要將二進(jìn)制precision
轉(zhuǎn)換成十進(jìn)制precision
,需要乘以0.30103(也就是precision
x0.30103)捻悯。要將十進(jìn)制precision
轉(zhuǎn)換為二進(jìn)制precision
匆赃,請(qǐng)將十進(jìn)制precision
乘以3.32193。二進(jìn)制precision
的最大值126位大約等于十進(jìn)制precision
的38位。
NUMBER
和FLOAT
之間的區(qū)別可以通過(guò)示例很好地說(shuō)明。在以下示例中宝冕,將相同的值插入NUMBER
和FLOAT
列:
在此示例中,
FLOAT
返回的值不能超過(guò)5個(gè)二進(jìn)制數(shù)字瞬项。可以由5個(gè)二進(jìn)制數(shù)字表示的最大十進(jìn)制數(shù)是31何荚。最后一行包含的十進(jìn)制值超過(guò)31囱淋。因此,FLOAT
必須將該值截?cái)嗖吞粒员闫溆行?shù)字不需要超過(guò)5個(gè)二進(jìn)制數(shù)字妥衣。因此123.45會(huì)四舍五入為120,該位數(shù)只有兩個(gè)有效的十進(jìn)制數(shù)字戒傻,僅需要4個(gè)二進(jìn)制數(shù)字税手。(5x0.30103約等于2,所以FLOAT保留2位有效數(shù)字需纳。)Oracle建議我們使用
BINARY_FLOAT
和BINARY_DOUBLE
芦倒,因?yàn)樗鼈冃矢摺?br>
注:FLOAT
存儲(chǔ)的是精確值,它是十進(jìn)制精度候齿。
Floating-Point Numbers
浮點(diǎn)數(shù)可以從第一個(gè)數(shù)字到最后一個(gè)數(shù)字的任何地方有小數(shù)點(diǎn)熙暴,或者根本沒(méi)有小數(shù)點(diǎn)』哦ⅲ可以在數(shù)字后面使用指數(shù)來(lái)增加范圍,例如1.777 e -20掂器。scale
不適用浮點(diǎn)數(shù)亚皂,因?yàn)樾?shù)點(diǎn)后可以出現(xiàn)的位數(shù)不受限制。
二進(jìn)制Floating-Point
在Oracle數(shù)據(jù)庫(kù)中存儲(chǔ)值得方式跟NUMBER
不同国瓮。NUMBER
使用十進(jìn)制精度存儲(chǔ)值灭必。所有符合NUMBER
范圍和精度的字面值都會(huì)作為NUMBER
數(shù)據(jù)類(lèi)型精確存儲(chǔ)∧四。可以精確存儲(chǔ)字面值的原因是禁漓,這些值使用十進(jìn)制精度表示(0-9)。二進(jìn)制Floating-Point
使用二進(jìn)制精度存儲(chǔ)(0-1)孵睬。二進(jìn)制精度值無(wú)法精確表示所有十進(jìn)制精度值播歼。通常 ,將一個(gè)值從十進(jìn)制精度轉(zhuǎn)換成二進(jìn)制精度掰读,當(dāng)撤銷(xiāo)時(shí)從二進(jìn)制精度轉(zhuǎn)換回十進(jìn)制精度時(shí)會(huì)發(fā)生錯(cuò)誤秘狞。比如0.1叭莫,轉(zhuǎn)換成二進(jìn)制(0.0001100110011001)會(huì)丟失精度。
Oracle數(shù)據(jù)庫(kù)專(zhuān)門(mén)為浮點(diǎn)數(shù)提供了兩種數(shù)據(jù)類(lèi)型:
BINARY_FLOAT
BINARY_FLOAT
BINARY_FLOAT
是32位單精度浮點(diǎn)數(shù)數(shù)據(jù)類(lèi)型烁试。每個(gè)BINARY_FLOAT
值需要4個(gè)字節(jié)雇初。
BINARY_DOUBLE
BINARY_DOUBLE
BINARY_DOUBLE
是64位雙精度浮點(diǎn)數(shù)數(shù)據(jù)類(lèi)型。每個(gè)BINARY_DOUBLE
值需要8個(gè)字節(jié)减响。
在NUMBER
列中靖诗,浮點(diǎn)數(shù)具有十進(jìn)制精度。在BINARY_FLOAT
或BINARY_DOUBLE
列中支示,浮點(diǎn)數(shù)具有二進(jìn)制精度呻畸。二進(jìn)制浮點(diǎn)數(shù)支持特殊值infinity和NaN(不是數(shù)字)。