全部产品
云市场

基本元素

更新时间:2019-09-18 01:16:17

数据类型

OceanBase支持如下数据类型:

  • 数值类型
  • 日期时间类型
  • 文本类型

数值类型

数值类型可以划分为三类:

  • 整数类型:BOOL/BOOLEANTINYINTSMALLINTMEDIUMINTINT/INTEGERBIGINT
  • 定点类型:DECIMAL/NUMERIC
  • 浮点类型:FLOATDOUBLE
  • Bit-Value类型:BIT

所有数据类型都可以同时使用UNSIGNED关键字声明为无符号类型,这会导致值域发生变化。

数值类型在定义时可以指定precision和scale,不同类型中precision和scale的含义可能有所不同,详情请见各类型详细说明。

整数类型

整数类型为定长、精确数值类型,值域取决于类型长度,以及是否为无符号,precision只表示最小显示宽度,详见“ZEROFILL属性”节。以下为相关信息:

类型 长度(字节) 值域(有符号) 值域(无符号)
BOOL/BOOLEAN/TINYINT 1 [-2 ^ 7 , 2 ^ 7 - 1] [0, 2 ^ 8 - 1]
SMALLINT 2 [-2 ^ 15, 2 ^ 15 - 1] [0, 2 ^ 16 - 1]
MEDIUMINT 3 [-2 ^ 23, 2 ^ 23 - 1] [0, 2 ^ 24 - 1]
INT/INTEGER 4 [-2 ^ 31, 2 ^ 31 - 1] [0, 2 ^ 32 - 1]
BIGINT 8 [-2 ^ 63, 2 ^ 63 - 1] [0, 2 ^ 64 - 1]

BOOL等价于BOOLEAN,这两个类型又等价于TINYINT(1)

INT等价于INTEGER

定点类型

定点类型为变长、精确数值类型,值域和精度取决于precision和scale,以及是否为无符号。precision和scale分别表示十进制下的总最大有效位数、小数部分最大有效位数,整数部分最大有效位数等于precision - scale,其中precision和scale的最大值分别为65、30,默认值分别为10、0。例如:

  • DECIMAL(5, 2),整数部分和小数部分最大有效位数分别为3、2,所以值域为[-999.99, 999.99]。
  • 如果同时定义为UNSIGNED,则值域为[0, 999.99]。

DECIMAL等价于NUMERIC

浮点类型

浮点类型为定长、非精确数值类型,值域和精度取决于类型长度、precision和scale,以及是否为无符号。precision和scale分别表示十进制下的总最大有效位数、小数部分最大有效位数,整数部分最大有效位数等于precision - scale,其中precision和scale的最大值分别为53、30。

浮点类型的精度只是IEEE标准中规定的理论值,实际情况可能因硬件或操作系统限制略有不同。

以下为不指定precision和scale时的默认信息:

类型 长度(字节) 值域(有符号) 值域(无符号) 精度
FLOAT 4 [-2 ^ 128, 2 ^ 128] [0, 2 ^ 128] 7位
DOUBLE 8 [-2 ^ 1024, 2 ^ 1024] [0, 2 ^ 1024] 15位

如果指定precision和scale,则值域确定方法与定点类型相同。

ZEROFILL属性

数值类型在定义时可以通过ZEROFILL关键字指定最小显示宽度,同时将该类型隐式定义为UNSIGNED。在数据实际显示宽度不足最小显示宽度时,通过先在小数部分补零到scale上限、再在整数部分补零到precision上限的方式,将显示宽度补足到最小显示宽度。例如:

  • INT(5) ZEROFILL:当数据值为123时,将显示为00123
  • DECIMAL(10, 5) ZEROFILL:当数据值为123.456时,将显示为00123.45600

BIT-Value类型

BIT数据类型用于存储bit values。一个BIT(M)能够存储M-bit的值,M的范围是1~64。

bit value通过b’value’的形式指定,value是用0和1来指定的,例如,b’111’表示7,b’10000000’表示128。

当向BIT(M)列插入值时,如果插入值的长度小于M,则会在左侧填充0。例如:将b’101’插入到BIT(6)时,相当于插入了b’000101’。

日期时间类型

以下为相关信息:

类型 格式 下界 上界 含义
DATETIME YYYY-MM-DD HH:MM:SS[.fraction] 0000-01-01 00:00:00.000000 9999-12-31 23:59:59.999999 日期时间(不考虑时区)
TIMESTAMP YYYY-MM-DD HH:MM:SS[.fraction] 0000-01-01 00:00:00.000000 9999-12-31 23:59:59.999999 日期时间(考虑时区)
DATE YYYY-MM-DD 0000-01-01 9999-12-31 日期
TIME HH:MM:SS[.fraction] -838:59:59.000000 838:59:59.000000 时间
YEAR YYYY 1901 2155 年份

DATETIMETIMESTAMPTIME的值域和精度取决于scale。该属性表示小数部分最大有效位数,最大值为6,默认值为0。

文本类型

以下为普通文本类型相关信息:

类型 长度 定义长度上限(字符) 字符集
VARCHAR 变长 262144 / 256K UTF8MB4
VARBINARY 变长 1048576 / 1M BINARY
CHAR 定长 256 UTF8MB4
BINARY 定长 256 BINARY
enum 变长 最多定义65535个元素,每个元素长度最多255个字符 UTF8MB4
set 变长 最多定义64个元素,每个元素长度最多255个字符 UTF8MB4

以下为大对象类型相关信息:

类型 长度 存储长度上限(字节) 字符集
TINYTEXT 变长 256 UTF8MB4
TINYBLOB 变长 256 BINARY
TEXT 变长 65536 / 64K UTF8MB4
BLOB 变长 65536 / 64K BINARY
MEDIUMTEXT 变长 16777216 / 16M UTF8MB4
MEDIUMBLOB 变长 16777216 / 16M BINARY
LONGTEXT 变长 50331648 / 48M UTF8MB4
LONGBLOB 变长 50331648 / 48M BINARY

表达式

表达式是广义概念,通常有若干个输入参数,并且返回一个输出结果。其中输入参数可能来自于常量或单行数据,也可能来自于多行数据。表达式可以组合,一个表达式的输入可以为另一个表达式的输出。

根据表达式的来源和形式,可分为如下几类:

  • 列引用。
  • 常量。
  • 运算符。
  • 函数。

例如:

  1. SELECT ABS(a + 1)
  2. FROM t1
  3. WHERE a > 0;
  • a为列引用。
  • 0、1为常量。
  • >+为运算符,以0、1、a表达式为输入。
  • ABS为函数,以+表达式为输入。

类型转换

OceanBase支持显式类型转换和隐式类型转换。

显示类型转换通过CAST函数实现。

隐式类型转换发生在这样的场景中:一个操作需要一个指定类型的参数,但语句的实际参数值并不是指定类型,这时OceanBase会将实际参数值转为指定类型后,再进行后续操作。

字符集

目前只支持如下字符集:

  • UTF8MB4:变长编码,字符最大长度4字节。
  • BINARY:定长编码,字符固定长度1字节。

UT8/UTF8MB3UTF8MB4的子集,变长编码,字符最大长度3字节。为支持无缝迁移,OceanBase在语法上将UTF8视为UTF8MB4的同义词。

排序规则

目前只支持如下排序规则:

  • UTF8MB4UTF8MB4_GENERAL_CI
  • UTF8MB4UTF8MB4_BIN
  • BINARYBINARY

数据比较规则

OceanBase允许任意两或多个任意类型的数据进行比较,比较结果可能为:

  • 非0 / TRUE
  • 0 / FALSE。
  • NULL。

如果参与比较的数据类型不一致,OceanBase会根据相关规则确定一个用于比较的数据类型,逻辑上所有参与比较的数据都需要先转换为该数据类型才能参与比较操作。

如果比较类型为文本类型,则还需要确定一个用于比较的排序规则。

字面量

文本

文本是使用单引号'或双引号"引起来的字符序列,如果打开ANSI_QUOTES模式,那只有单引号'可以用于引用字符串。

数值

十进制数值可以分为精确数值(整数和定点数值)和浮点数值。数值可以使用小数点.作为十进制分隔符,也可以在前面加一个负号-来表示负值。

十六进制数值只支持整数数值,以前缀0X开始,允许出现字母AF,所有字母不区分大小写。

日期时间

日期时间字面量有文本或数值两种形式。

  • 文本格式可使用全量分隔符:'2015-07-21 12:34:56.789',或完全不使用分隔符:'20150721'
  • 数值格式只允许使用小数点.作为秒和微秒部分的分隔符:20150721123456.789
  • 在需要使用分隔符时,除了秒和微秒部分之间只能使用小数点.外,其它分隔符建议只使用-/:等常用分隔符。

转义字符

转义字符是在字符串中,某些序列前添加反斜线\,用于表示特殊含义。转义字符对大小写敏感。例如\b表示退格,但\B表示B

以下为所有转义符列表:

转义符 含义
\b 退格符。
\f 换页符。
\n 换行符。
\r 回车符。
\t tab字符。
\\ 反斜线字符。
\' 单引号。
\" 双引号。
\_ 下划线。
\% 百分号。
\0 NULL。
\Z ASCII 26,控制符Ctrl+Z。

注释

SQL语句

在普通SQL语句中,OceanBase支持如下3种注释方法:

  • #到行尾。
  • __到行尾。
  • /**/

数据库对象

在DDL语句中通过COMMENT子句可以位数据库对象指定注释。例如:

create table t(pk INT PRIMARY KEY COMMENT '主键');