OceanBase 数据库操作的每个值都有一个数据类型。值的数据类型将一组固定的属性与值相关联,这些属性使 OceanBase 将一种数据类型的值与另一种数据类型的值区别对待。OceanBase 数据库提供了许多内建数据类型, 这些内建数据类型也称 OceanBase 基本数据类型。
数据类型
OceanBase 支持如下数据类型,与 Oracle 数据类型保持一致:
- 字符数据类型
- 数值数据类型
- 日期时间类型
- RAW 数据类型
- 大对象数据类型
字符数据类型
字符数据类型在数据库字符集或国家字符集中存储字符(字母数字)数据,即单词和自由格式的文本。字符数据类型与其他数据类型相比具有限制性,因此属性较少。
字符数据存储在字符串中,其字节值与创建数据库时指定的字符集之一相对应。OceanBase 支持单字节和多字节字符集。
说明:
字符数据类型的列可以存储所有字母数字值,但是
NUMBER
数据类型的列只能存储数字值。
数据类型 | 长度 | 使用说明 | 长度说明 |
CHAR(size [BYTE | CHAR]) | 定长 | 索引效率高,程序里面使用 trim 去除多余的空白。 | 参数 size 必须是一个介于 1~2000 之间的数值,存储大小为 size 个字节。 |
NCHAR[(size)] | 定长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示) 。 | 参数 size 必须是一个介于 1~2000 之间的数值,存储大小为 size 字节的两倍。 |
NVARCHAR2(size) | 变长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 size 的值必须介于 1~32767 之间,字节的存储大小是所输入字符个数的两倍。 |
VARCHAR2(size [BYTE | CHAR]) | 变长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 size 必须是一个介于 1~32767 之间的数值,存储大小为输入数据的字节的实际长度,而不是 size 个字节。 |
VARCHAR(size [BYTE | CHAR]) | 变长 | OceanBase 中 VARCHAR 和 VARCHAR2 没有区别。 | 参数 size 必须是一个介于 1~32767 之间的数值,存储大小为输入数据的字节的实际长度,而不是 size 个字节。 |
其中,CHAR
和 VARCHAR2
数据类型需要指定 length
语义,其默认值由系统变量 NLS_LENGTH_SEMANTICS
控制。
数值数据类型
OceanBase 为我们提供了四种存储数值的数据类型,它们分别是 NUMBER
、FLOAT
、BINARY_FLOAT
和 BINARY_DOUBLE
。您可以通过这四种数值类型存储定点数、浮点数和零。在数值计算时,数值类型具有不同的优先级,具体信息请查阅 数值类型的优先级。
数据类 | 长度(字节) | 说明 |
NUMBER | 4~40 | NUMBER(p,s) 存储变长、十进制精度的定点数;也可以存储浮点数,此时 NUMBER 没有 p 和 s 。 |
FLOAT | 4~40 | FLOAT(p) 是 NUMBER 数据类型的子类型。二进制精度范围为 1~126。FLOAT 不是浮点数。 |
BINARY_FLOAT | 4 | 二进制精度浮点数,是一种 32 位单精度浮点数数据类型。 |
BINARY_DOUBLE | 8 | 二进制精度浮点数,是一种 64 位双精度浮点数数据类型。 |
日期时间类型
与 Oracle 中的数据类型一致,OceanBase 也支持日期时间和间隔数据类型。日期时间数据类型被用来在数据库中保存日期和时间信息。与日期时间数据类型存储特定的一个时间点不同,间隔数据类型用来存储一段时间,可以有效表示了两个日期时间值之间的差异。
- 日期时间数据类型:
DATE
、TIMESTAMP
、TIMESTAMP WITH TIME ZONE
和TIMESTAMP WITH LOCAL TIME ZONE
。 - 间隔数据类型:
INTERVAL YEAR TO MONTH
和INTERVAL DAY TO SECOND
。
类型 | 格式 | 取值范围 | 说明 |
DATE | DD-MON-RR | 0001-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 存储日期和时间信息,精确到秒,不带时区。 |
TIMESTAMP [(scale)] | DD-MON-RR HH.MI.SSXFF AM | 0001-01-01 00:00:00.000000000 ~ 9999-12-31 23:59:59.999999999 | DATE 数据类型的扩展,精确到纳秒,不带时区。 |
TIMESTAMP [(scale)] WITH TIME ZONE | DD-MON-RR HH.MI.SSXFF AM TZR | 0001-01-01 00:00:00.000000000 ~ 9999-12-31 23:59:59.999999999 | DATE 数据类型的扩展,精确到纳秒,带时区信息。 |
TIMESTAMP [(scale)] WITH LOCAL TIME ZONE | DD-MON-RR HH.MI.SSXFF AM | 0001-01-01 00:00:00.000000000 ~ 9999-12-31 23:59:59.999999999 | 带有本地时区的 TIMESTAMP 值,存储数据库时区。 |
INTERVAL YEAR TO MONTH | INTERVAL ’year-month’ YEAR(percision) TO MONTH | 由参数 percision 确定 YEAR 元素的精度。 | 存储以年和月为单位的时间段。 |
INTERVAL DAY TO SECOND | INTERVAL ’dd hh:mm:ss’ DAY(precision) TO SECOND(fractional_seconds_precision) | 由参数 precision 和 fractional_seconds_precision 确定 DAY 元素的精度和 SECOND 元素小数部分的精度。 | 存储以天、小时、分钟和秒为单位的时间段。 |
TIMESTAMP [(scale)]
、TIMESTAMP [(scale)] WITH TIME ZONE
、TIMESTAMP [(scale)] WITH LOCAL TIME ZONE
的值域和精度取决于 scale
。该属性表示小数部分的最大有效位数,取值范围 0~9,默认值为 6。
其中,时间类型的格式受系统变量 NLS_DATE_FORMAT
、 NLS_TIMESTAMP_FORMAT
和 NLS_TIMESTAMP_TZ_FORMAT
控制。
日期时间和间隔可以进行计算,具体信息请查阅 日期时间 DATE 和间隔 INTERVAL 的计算。
RAW 数据类型
OceanBase 中用于保存二进制数据或字节字符串的数据类型是 RAW
,是一种可变长度的数据类型,在不同平台上传输时,传送的都是二进制信息,即使字符集不同也不需要转换。
大对象数据类型
大对象数据类型(Large Object),简称 LOB。用来存储大型和非结构化数据,例如文本、图像、视频和空间数据等。
类型 | 长度 | 定义长度上限(字节) | 字符集 |
BLOB | 变长 | 48M | BINARY |
CLOB | 变长 | 48M | UTF8MB4 |