CHAR Data Type
CHAR是用数据库字符集定义的长度固定的字符串类型,其定义方式如下:
CHAR [ (size [ BYTE | CHAR ]) ]
中括号中的内容是可选项的,size表示字符串的长度 ,BYTE和CHAR表示长度单位。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-8,UTF8是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必须指定,BYTE或CHAR可以省略。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)要求小数点后的第一位为零,并将所有值四舍五入到小数点后的第五位。
指定定点数的precision和scale是最佳实践,它可以对输入进行额外的完整性检查。定义precision和scale并不会强制所有值必须是固定长度。如果值超过precision,则Oracle返回错误。如果值超过scale,则Oracle对其进行四舍五入。
定义整数:
NUMBER(p)
它表示定点数,等价于NUMBER(p,0)。
定义浮点数:
NUMBER
省略precision和scale指示Oracle使用NUMBER的最大范围和精度。
NUMBER使用案例.png
FLOAT Data Type
FLOAT [ (precision) ]
FLOAT数据类型是NUMBER的子类型。可以指定precision,也可以不指定precision,其定义与NUMBER的precision相同,范围从1到126。scale不能被定义,但是可以从数据中解释。每一个FLOAT值需要1到22个字节。
要将二进制precision转换成十进制precision,需要乘以0.30103(也就是precisionx0.30103)。要将十进制precision转换为二进制precision,请将十进制precision乘以3.32193。二进制precision的最大值126位大约等于十进制precision的38位。
NUMBER和FLOAT之间的区别可以通过示例很好地说明。在以下示例中,将相同的值插入NUMBER和FLOAT列:
FLOAT与NUMBER的区别.png
在此示例中,
FLOAT返回的值不能超过5个二进制数字。可以由5个二进制数字表示的最大十进制数是31。最后一行包含的十进制值超过31。因此,FLOAT必须将该值截断,以便其有效数字不需要超过5个二进制数字。因此123.45会四舍五入为120,该位数只有两个有效的十进制数字,仅需要4个二进制数字。(5x0.30103约等于2,所以FLOAT保留2位有效数字。)Oracle建议我们使用
BINARY_FLOAT和BINARY_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_FLOAT或BINARY_DOUBLE列中,浮点数具有二进制精度。二进制浮点数支持特殊值infinity和NaN(不是数字)。
Floating-Point取值范围.png








网友评论