Oracle常用数据类型

CHAR Data Type

CHAR是用数据库字符集定义的长度固定的字符串类型,其定义方式如下:

CHAR [ (size [ BYTE | CHAR ]) ]

中括号中的内容是可选项的,size表示字符串的长度 ,BYTECHAR表示长度单位。BYTE是指字符串的字节数,CHAR是指根据数据库字符集中的码点为单位的长度,也就是说如果码点是2个字节,size定义为3,那么一共就是6个字节。
如果省略长度单位,那么默认由NLS_LENGTH_SEMANTICS这个参数决定,一般是BYTE
CHAR中存储的数据具有固定长度,如果长度小于size,会用空白符填充。
如果省略size,那么默认就是1。
size最大值为2000,表示2000个字节或字符(码点)。由于可以存储在CHAR中的数据最大为2000字节,因此如果字符集中的码点大于1个字节,那么就无法存储2000个字符。如果希望存储任何数据库字符集中的字符,那么size必须小于等于500(一般码点最多4个字节)。

NCHAR Data Type

NCHAR是用国家字符集定义的长度固定的字符串类型,国家字符集可以指定为AL16UTF16或UTF8。其定义方式如下:

NCHAR [ (size) ]

中括号中的内容是可选项的,size表示字符串的长度 或者可以说有多少个码点,一个码点在AL16UTF16中始终具有2个字节,而在UTF8中始终具有1至3个字节(UTF8不等于UTF-8UTF8是oracle中定义的字符集,它对应于CESU-8)。
NCHAR中存储的数据具有固定长度,如果长度小于size,会用空白符填充(如果是UTF-8,那么字节数不一定相同)。
如果省略size,那么默认就是1。
当国家字符集为AL16UTF16时size最大值为1000个字符,当国家字符集为UTF8时,size最大值为2000个字符。但是需要注意的是NCHAR最多只能存储2000个字节,因此如果你希望始终能够存储size个国家字符集中的字符,那么size必须小于等于666(2000/3)。

VARCHAR2 Data Type

VARCHAR2是数据库字符集定义的可变长的字符串类型,其定义格式如下:

VARCHAR2 (size [ BYTE | CHAR ])

其中size必须指定,BYTECHAR可以省略。BYTE是指字符串的字节数,CHAR是指根据数据库字符集中的码点为单位的长度,一个码点可以具有1到4个字节(这点跟NCHAR不同,主要是它们使用了不同的字符集)。如果未指定长度单位,默认由NLS_LENGTH_SEMANTICS这个参数决定,一般是BYTE
size最小值为1,最大值为:

  • 32767字节,如果 MAX_STRING_SIZE = EXTENDED
  • 4000字节,如果 MAX_STRING_SIZE = STANDARD

根据MAX_STRING_SIZE的参数不同,VARCHAR2最多能存储32767或4000字节。如果你希望始终能够存储size个数据库字符集中的字符,那么size必须小于等于8191(32767/4,MAX_STRING_SIZE = EXTENDED)或1000(4000/4,MAX_STRING_SIZE = STANDARD)。

VARCHAR Data Type

不要使用VARCHAR数据类型,请改用VARCHAR2数据类型。尽管该VARCHAR数据类型当前是VARCHAR2的同义词,但未来会重新定义。

NVARCHAR2 Data Type

NVARCHAR2是用国家字符集定义的可变长的字符串类型,国家字符集可以指定为AL16UTF16或UTF8。其定义方式如下:

NVARCHAR2 (size )

其中size必须指定,表示多少个字符或者更确切地说表示多少个国家字符集中的码点。一个码点在AL16UTF16中始终具有2个字节,而在UTF8中始终具有1至3个字节。
size最小值为1,最大值为:

  • 16383 MAX_STRING_SIZE = EXTENDED并且国家字符集为AL16UTF16
  • 32767 MAX_STRING_SIZE = EXTENDED并且国家字符集是UTF8
  • 2000 MAX_STRING_SIZE = STANDARD并且国家字符集为AL16UTF16
  • 4000 MAX_STRING_SIZE = STANDARD国家字符集为UTF8

根据MAX_STRING_SIZE的参数不同,NVARCHAR2最多能存储32767或4000字节。如果你希望始终能够存储size个国家字符集中的字符,那么size必须小于等于10922(32767/3,MAX_STRING_SIZE = EXTENDED,国家字符集定义为UTF8)或1333(4000/3, MAX_STRING_SIZE = STANDARD,国家字符集定义为UTF8)。

NUMBER Data Type

NUMBER数据类型可以存储零、正定点数和负定点数,绝对值取值范围从1.0 x 10-130到1.0 x 10126。其定义格式如下:

NUMBER [ (precision [, scale ]) ]
  • precision表示精度,也就是十进制数的最大有效位。其中最高有效数字是最左边的非零数字,最低有效数字是最右边的数字。Oracle保证数字的可移植性,精度的取值范围从1到38。
  • scale表示范围或小数位的位数,取值范围从-84到127。
    如果scale是正数,它表示从小数点右边到最低有效位的位数(包括最低有效位数)。
    如果scale是负数,它表示小数点左边的位数(不包括最低有效位数)。最低有效数字在小数点的左侧,因为实际数据会四舍五入到小数点左侧的指定位数。例如(10,-2) 表示四舍五入到100。
    注:如果小数点左边有效位数小于等于scale,那么数据会变为0。

scale可以比precision大,典型的用法是带e符号的小数。当scale大于precision时,precision指定小数点右边的最大有效位数(小数点左边不可能有有效位了,因为一旦有的话precision必然大于scale,这跟这里讨论的情况不一致)。例如,NUMBER(4,5)要求小数点后的第一位为零,并将所有值四舍五入到小数点后的第五位。
指定定点数的precisionscale是最佳实践,它可以对输入进行额外的完整性检查。定义precisionscale并不会强制所有值必须是固定长度。如果值超过precision,则Oracle返回错误。如果值超过scale,则Oracle对其进行四舍五入。
定义整数:

NUMBER(p)

它表示定点数,等价于NUMBER(p,0)
定义浮点数:

NUMBER 

省略precisionscale指示Oracle使用NUMBER的最大范围和精度。

NUMBER使用案例.png

FLOAT Data Type
FLOAT [ (precision) ]

FLOAT数据类型是NUMBER的子类型。可以指定precision,也可以不指定precision,其定义与NUMBERprecision相同,范围从1到126。scale不能被定义,但是可以从数据中解释。每一个FLOAT值需要1到22个字节。
要将二进制precision转换成十进制precision,需要乘以0.30103(也就是precisionx0.30103)。要将十进制precision转换为二进制precision,请将十进制precision乘以3.32193。二进制precision的最大值126位大约等于十进制precision的38位。
NUMBERFLOAT之间的区别可以通过示例很好地说明。在以下示例中,将相同的值插入NUMBERFLOAT列:

FLOAT与NUMBER的区别.png

在此示例中,FLOAT返回的值不能超过5个二进制数字。可以由5个二进制数字表示的最大十进制数是31。最后一行包含的十进制值超过31。因此,FLOAT必须将该值截断,以便其有效数字不需要超过5个二进制数字。因此123.45会四舍五入为120,该位数只有两个有效的十进制数字,仅需要4个二进制数字。(5x0.30103约等于2,所以FLOAT保留2位有效数字。)
Oracle建议我们使用BINARY_FLOATBINARY_DOUBLE,因为它们效率更高。
注:FLOAT存储的是精确值,它是十进制精度。

Floating-Point Numbers

浮点数可以从第一个数字到最后一个数字的任何地方有小数点,或者根本没有小数点。可以在数字后面使用指数来增加范围,例如1.777 e -20。scale不适用浮点数,因为小数点后可以出现的位数不受限制。
二进制Floating-Point在Oracle数据库中存储值得方式跟NUMBER不同。NUMBER使用十进制精度存储值。所有符合NUMBER范围和精度的字面值都会作为NUMBER数据类型精确存储。可以精确存储字面值的原因是,这些值使用十进制精度表示(0-9)。二进制Floating-Point使用二进制精度存储(0-1)。二进制精度值无法精确表示所有十进制精度值。通常 ,将一个值从十进制精度转换成二进制精度,当撤销时从二进制精度转换回十进制精度时会发生错误。比如0.1,转换成二进制(0.0001100110011001)会丢失精度。
Oracle数据库专门为浮点数提供了两种数据类型:
BINARY_FLOAT

BINARY_FLOAT

BINARY_FLOAT是32位单精度浮点数数据类型。每个BINARY_FLOAT值需要4个字节。
BINARY_DOUBLE

BINARY_DOUBLE

BINARY_DOUBLE是64位双精度浮点数数据类型。每个BINARY_DOUBLE值需要8个字节。
NUMBER列中,浮点数具有十进制精度。在BINARY_FLOATBINARY_DOUBLE列中,浮点数具有二进制精度。二进制浮点数支持特殊值infinity和NaN(不是数字)。

Floating-Point取值范围.png

参考资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352