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