一.字符数据类型
字符数据类型以字符串形式存储字符(字母数字)数据,其字节值对应于字符编码方案,通常称为字符集或代码页。
创建数据库时,将建立数据库的字符集。 字符集的示例是7位ASCII(美国信息交换标准代码),EBCDIC(扩展二进制编码的十进制交换代码),代码页500,日本扩展UNIX和Unicode UTF-8。 Oracle支持单字节和多字节编码方案。
1.char
CHAR数据类型存储固定长度的字符串。 当创建带有CHAR列的表时,必须为CHAR列宽度指定1到2000个字节之间的字符串长度(以字节或字符为单位)。 默认值为1个字节。 然后,Oracle保证:
当您在表中插入或更新一行时,CHAR列的值具有固定的长度。
如果提供较短的值,则该值将空白填充为固定长度。
如果值太大,Oracle数据库将返回错误。
Oracle数据库使用空白填充的比较语义比较CHAR值。
2.VARCHAR2和VARCHAR
VARCHAR2数据类型存储长度可变的字符串。 当创建带有VARCHAR2列的表时,请为VARCHAR2列指定1到4000字节之间的最大字符串长度(以字节或字符为单位)。 对于每一行,除非值超过列的最大长度,否则Oracle数据库会将列中的每个值存储为一个可变长度字段,在这种情况下,Oracle数据库将返回错误。 使用VARCHAR2和VARCHAR可以节省表使用的空间。
例如,假设您声明一列VARCHAR2,最大大小为50个字符。 在单字节字符集中,如果仅给特定行中的VARCHAR2列值提供10个字符,则该行的行中的该列仅存储10个字符(10个字节),而不存储50个字符。
Oracle数据库使用未填充的比较语义比较VARCHAR2值。
VARCHAR数据类型与VARCHAR2数据类型同义。 为了避免行为上的可能变化,请始终使用VARCHAR2数据类型来存储长度可变的字符串。
字符数据类型的长度语义:
全球化支持允许将各种字符集用于字符数据类型。全球化支持使您可以处理单字节和多字节字符数据并在字符集之间进行转换。客户端会话可以使用与数据库字符集不同的客户端字符集。
在为字符数据类型指定列长时,请考虑字符的大小。在估计带有包含字符数据的列的表的空间时,必须考虑此问题。
字符数据类型的长度语义可以字节或字符为单位。
字节语义将字符串视为字节序列。这是字符数据类型的默认设置。
字符语义将字符串视为字符序列。从技术上讲,字符是数据库字符集的代码点。
对于单字节字符集,在字符语义中定义的列与在字节语义中定义的列基本相同。字符语义对于定义宽度可变的多字节字符串很有用。在定义数据存储的实际长度要求时,它降低了复杂性。例如,在Unicode数据库(UTF8)中,必须定义一个VARCHAR2列,该列最多可以存储五个中文字符和五个英文字符。在字节语义上,这将需要(5 * 3字节)+(1 * 5字节)= 20字节;在字符语义上,该列将需要10个字符。
VARCHAR2(20 BYTE)和SUBSTRB(<string>,1,20)使用字节语义。 VARCHAR2(10 CHAR)和SUBSTR(<string>,1,10)使用字符语义。
参数NLS_LENGTH_SEMANTICS决定字符数据类型的新列是否使用字节或字符语义。默认的长度语义是字节。如果数据库中的所有字符数据类型列都使用字节语义(或全部使用字符语义),则用户不必担心哪些列使用哪种语义。如果可能,应避免使用前面显示的BYTE和CHAR限定词,因为它们会导致混合语义数据库。而是应在服务器参数文件(SPFILE)或初始化参数文件中适当设置NLS_LENGTH_SEMANTICS初始化参数,并且列应使用默认语义。
3.NCHAR和NVARCHAR2
NCHAR和NVARCHAR2是存储Unicode字符数据的Unicode数据类型。 NCHAR和NVARCHAR2数据类型的字符集只能是AL16UTF16或UTF8,并在数据库创建时指定为国家字符集。 AL16UTF16和UTF8都是Unicode编码。
NCHAR数据类型存储与国家字符集相对应的固定长度的字符串。
NVARCHAR2数据类型存储可变长度的字符串。
使用NCHAR或NVARCHAR2列创建表时,指定的最大大小始终是字符长度语义。字符长度语义是NCHAR或NVARCHAR2的默认且唯一的长度语义。
例如,如果国家字符集为UTF8,则以下语句定义最大字节长度为90个字节:
创建表tab1(col1 NCHAR(30));
该语句创建一个最大字符长度为30的列。最大字节长度是每个字符中最大字符长度和最大字节数的倍数。
本节包括以下主题:
NCHAR
NVARCHAR2
NCHAR
NCHAR列的最大长度为2000字节。最多可容纳2000个字符。实际数据的最大字节数限制为2000。必须在运行时同时满足两个大小限制。 NVARCHAR2
NVARCHAR2列的最大长度为4000字节。最多可容纳4000个字符。实际数据的最大字节数限制为4000。必须在运行时同时满足两个大小限制。
在Oracle数据库中使用Unicode数据:
Unicode是一种对人类已知的每种语言中的每个字符进行统一编码的一种尝试。它还提供了一种表示私有定义字符的方法。存储Unicode的数据库列可以存储以任何语言编写的文本。
部署全球化应用程序的Oracle数据库用户强烈需要在Unicode数据库中存储Unicode数据。无论数据库字符集如何,他们都需要一个保证为Unicode的数据类型。
Oracle数据库通过NCHAR,NVARCHAR2和NCLOB支持可靠的Unicode数据类型。这些数据类型保证为Unicode编码,并且始终使用字符长度语义。 NCHAR / NVARCHAR2使用的字符集可以是UTF8或AL16UTF16,具体取决于创建数据库时本国字符集的设置。这些数据类型允许将Unicode中的字符数据存储在数据库中,该数据库可以使用也可以不使用Unicode作为数据库字符集。 隐式类型转换
除了CHAR / VARCHAR2的所有隐式转换之外,Oracle数据库还支持NCHAR / NVARCHAR2的隐式转换。还支持CHAR / VARCHAR2和NCHAR / NVARCHAR2之间的隐式转换。
4.LOB字符数据类型
字符数据的LOB数据类型为CLOB和NCLOB。 它们最多可以存储8 TB的字符数据(CLOB)或国家字符集数据(NCLOB)。
5.Long
定义为LONG的列可以存储可变长度的字符数据,其中包含多达2 GB的信息。 LONG数据是在不同系统之间移动时要适当转换的文本数据。
数据字典中使用LONG数据类型列来存储视图定义的文本。 您可以在SELECT列表,UPDATE语句的SET子句和INSERT语句的VALUES子句中使用LONG列。
不要使用LONG列创建表。 请改用LOB列(CLOB,NCLOB)。 仅支持LONG列以实现向后兼容。
Oracle还建议您将现有的LONG列转换为LOB列。 LOB列受的限制比LONG列少得多。 此外,LOB功能在每个发行版中都得到了增强,而LONG功能在多个发行版中都是静态的。
二.数值(Numeric )数据类型
数字数据类型存储正负定点和浮点数,零,无穷大以及作为操作未定义结果的值(即“不是数字”或NAN)。
1.NUMBER
NUMBER数据类型存储定点和浮点数。 几乎可以存储任何数量的数量,并保证这些数量可移植到运行Oracle数据库的不同系统之间,精度最高可达38位。
以下数字可以存储在NUMBER列中:
正数范围为1 x 10-130到9.99 ... 9 x 10125,最多38个有效数字
负数从-1 x 10-130到9.99 ... 99 x 10125,最多38个有效数字
零
正负无穷大(仅通过从Oracle数据库版本5导入而生成)
对于数字列,可以将列指定为:
column_name NUMBER
(可选)您还可以指定精度(总位数(整数+小数))和小数位数(小数点右边的位数):
column_name NUMBER(精度,小数位数)
如果未指定精度,则该列将存储给定的值。 如果未指定比例,则比例为零。
Oracle保证数字的可移植性,其精度等于或小于38位。 您可以指定比例,但不能指定精度:
column_name NUMBER(*,小数位数)
在这种情况下,精度为38,并保持指定的比例。
指定数字字段时,最好指定精度和小数位数。 这样可以对输入进行额外的完整性检查。
表26-1显示了如何使用不同的比例因子存储数据的示例。
Input Data | Specified As | Stored As |
---|---|---|
7,456,123.89 | NUMBER |
7456123.89 |
7,456,123.89 | NUMBER(*,1) |
7456123.9 |
7,456,123.89 | NUMBER(9) |
7456124 |
7,456,123.89 | NUMBER(9,2) |
7456123.89 |
7,456,123.89 | NUMBER(9,1) |
7456123.9 |
7,456,123.89 | NUMBER(6) |
(not accepted, exceeds precision) |
7,456,123.89 | NUMBER(7,-2) |
7456100 |
如果指定负比例,则Oracle数据库会将实际数据四舍五入到小数点左边的指定位数。例如,指定(7,-2)表示Oracle数据库四舍五入到最接近的百分之一,如表26-1所示。
对于数字的输入和输出,标准的Oracle数据库默认十进制字符是一个句点,如数字1234.56。十进制是分隔数字的整数和小数部分的字符。您可以使用初始化参数NLS_NUMERIC_CHARACTERS更改默认的十进制字符。您还可以使用ALTER SESSION语句在会话期间更改它。要输入不使用当前默认十进制字符的数字,请使用TO_NUMBER函数。 内部数字格式
Oracle数据库以可变长度格式存储数字数据。每个值都以科学计数法存储,其中1个字节用于存储指数,最多20个字节用于存储尾数。结果值限制为38位精度。 Oracle数据库不存储前导零和尾随零。例如,数字412以类似于4.12 x 102的格式存储,其中1个字节用于存储指数(2),2个字节用于存储尾数(4,1,2)的三个有效数字。负数包括其长度中的符号。
考虑到这一点,可以使用以下公式计算特定数字数据值NUMBER(p)的列大小(以字节为单位),其中p是给定值的精度。
ROUND((length(p)+s)/2))+1
其中,如果数字为正,则s等于零;如果数字为负,则s等于1。
零和正负无穷大(仅在从Oracle数据库版本5导入时生成)使用唯一表示存储。零和负无穷大各自需要1个字节;正无穷大需要2个字节。
2.Float
Oracle数据库专门为浮点数提供了两种数字数据类型:BINARY_FLOAT和BINARY_DOUBLE。它们支持NUMBER数据类型提供的所有基本功能。但是,虽然NUMBER使用十进制精度,但是BINARY_FLOAT和BINARY_DOUBLE使用二进制精度。这样可以加快算术运算的速度,通常可以减少存储需求。
BINARY_FLOAT和BINARY_DOUBLE是近似数字数据类型。它们存储十进制值的近似表示,而不是精确表示。例如,值0.1不能完全由BINARY_DOUBLE或BINARY_FLOAT表示。它们经常用于科学计算。它们的行为类似于Java和XMLSchema中的数据类型FLOAT和DOUBLE。
BINARY_FLOAT数据类型
BINARY_FLOAT是一种32位单精度浮点数数据类型。每个BINARY_FLOAT值需要5个字节,包括一个长度字节。 BINARY_DOUBLE数据类型
BINARY_DOUBLE是64位双精度浮点数数据类型。每个BINARY_DOUBLE值需要9个字节,包括一个长度字节
FLOAT数据类型
FLOAT(b)指定二进制精度为b的浮点数。 精度b的范围可以从1到126。要将二进制精度转换为十进制精度,请将b乘以0.30103。
根据这段话,我们可以看到,float(2)中的2是一个binary precision,而不是我们常用的decimal precision。他们之间的换算关系是:binary precision=int(b0.30103),因此我们这里实际上的精度应该等于int(20.30103)=0,即小数点后精度为0。
类似的,我们可以设计成float(10),那么int(100.30103)=3,因此,如果插入93.5,就得出9.35--精度为3-->9.350,9.35010^1=93.5。如果插入13884.2,得出1.38842--精度为3-->1.388,1.388*10^4=13880。
DATE,LOB,RAW,LONG RAW,ROWID,LONG ROWID等数据类型见:
https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT213
https://blog.csdn.net/m_123hj_520/article/details/53899564