OceanBase 4.2.5 CE BP2 HF1 – MySQL 模式数据类型参考
数据来源:源码路径 /Users/yuan/Documents/code/oceanbase-4.2.5_CE_BP2_HF1 核心定义文件:
deps/oblib/src/common/object/ob_obj_type.h — ObObjType 枚举定义
deps/oblib/src/rpc/obmysql/ob_mysql_global.h — MySQL 协议字段类型
deps/oblib/src/common/object/ob_obj_type.cpp — 取值范围数组
deps/oblib/src/lib/ob_define.h — 各类型最大长度常量
src/observer/table_load/backup/v_3_x/encoding/ob_encoding_util.h — 存储大小映射
一、整数类型 (Integer Types)
| 数据类型 | SQL 声明 | 内部类型 (ObObjType) | 存储大小 | 取值范围 (有符号) | 取值范围 (无符号) |
|---|
| TINYINT | TINYINT | ObTinyIntType (1) | 1 字节 | -2⁷ ~ 2⁷-1 | 0 ~ 2⁸-1 |
| SMALLINT | SMALLINT | ObSmallIntType (2) | 2 字节 | -2¹⁵ ~ 2¹⁵-1 | 0 ~ 2¹⁶-1 |
| MEDIUMINT | MEDIUMINT | ObMediumIntType (3) | 3 字节 | -2²³ ~ 2²³-1 | 0 ~ 2²⁴-1 |
| INT | INT / INTEGER | ObInt32Type (4) | 4 字节 | -2³¹ ~ 2³¹-1 | 0 ~ 2³²-1 |
| BIGINT | BIGINT | ObIntType (5) | 8 字节 | -2⁶³ ~ 2⁶³-1 | 0 ~ 2⁶⁴-1 |
源码注释:ObTinyIntType 即 MySQL BOOLEAN 类型。显示宽度上限 OB_MAX_INTEGER_DISPLAY_WIDTH = 255。
二、浮点类型 (Floating-Point Types)
| 数据类型 | SQL 声明 | 内部类型 | 存储大小 | 取值范围 |
|---|
| FLOAT | FLOAT[(M,D)] | ObFloatType (11) | 4 字节 | ±2⁻¹²⁶ ~ ±2¹²⁸(IEEE 754 单精度) |
| DOUBLE | DOUBLE[(M,D)] | ObDoubleType (12) | 8 字节 | ±2⁻¹⁰²² ~ ±2¹⁰²⁴(IEEE 754 双精度) |
| FLOAT UNSIGNED | FLOAT UNSIGNED | ObUFloatType (13) | 4 字节 | 同 FLOAT,仅非负 |
| DOUBLE UNSIGNED | DOUBLE UNSIGNED | ObUDoubleType (14) | 8 字节 | 同 DOUBLE,仅非负 |
源码常量:OB_MAX_FLOAT_PRECISION = 24,OB_MAX_DOUBLE_FLOAT_PRECISION = 53,OB_MAX_DOUBLE_FLOAT_SCALE = 30
三、定点数类型 (Fixed-Point Types)
| 数据类型 | SQL 声明 | 内部类型 | 存储大小 | 说明 |
|---|
| DECIMAL | DECIMAL[(M,D)] / NUMERIC[(M,D)] | ObNumberType (15) | 变长 | M 最大 65 位,D 最大 30 位 |
| DECIMAL UNSIGNED | DECIMAL UNSIGNED | ObUNumberType (16) | 变长 | 同 DECIMAL,仅非负 |
源码常量:OB_MAX_DECIMAL_PRECISION = 65,OB_MAX_DECIMAL_SCALE = 30,OB_MIN_DECIMAL_PRECISION = 1
四、日期时间类型 (Date and Time Types)
| 数据类型 | SQL 声明 | 内部类型 | 存储大小 | 取值范围 |
|---|
| DATE | DATE | ObDateType (19) / ObMySQLDateType (52) | 3 字节 | ‘1000-01-01’ ~ ‘9999-12-31’ |
| DATETIME | DATETIME[(fsp)] | ObDateTimeType (17) / ObMySQLDateTimeType (53) | 5~8 字节 | ‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59.999999’ |
| TIMESTAMP | TIMESTAMP[(fsp)] | ObTimestampType (18) | 4~7 字节 | ‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-19 03:14:07’ UTC |
| TIME | TIME[(fsp)] | ObTimeType (20) | 3~6 字节 | ‘-838:59:59’ ~ ‘838:59:59’ |
| YEAR | YEAR / YEAR(4) | ObYearType (21) | 1 字节 | 1901 ~ 2155 |
- fsp (fractional seconds precision):0~6 位微秒精度,fsp 越大存储越大
- 源码常量:
OB_MAX_DATETIME_PRECISION = 6,OB_MAX_DATE_PRECISION = 0
ObMySQLDateType 和 ObMySQLDateTimeType 是 OceanBase 4.x 新增的 MySQL 兼容内部类型,与 Oracle 模式的 DATE/DATETIME 使用不同的编码方式
五、字符串类型 (String Types)
| 数据类型 | SQL 声明 | 内部类型 | 最大长度 | 说明 |
|---|
| CHAR | CHAR(M) | ObCharType (23) | 256 字符 | 定长字符串,M: 0~256 |
| VARCHAR | VARCHAR(M) | ObVarcharType (22) | 2²⁰ 字节 (1MB) | 变长字符串 |
| BINARY | BINARY(M) | ObCharType (binary) | 255 字节 | 定长二进制 |
| VARBINARY | VARBINARY(M) | ObVarcharType (binary) | 2¹⁶ 字节 (64KB) | 变长二进制 |
| HEX STRING | X'hex' / 0xhex | ObHexStringType (24) | — | 十六进制字面量 |
源码常量:
OB_MAX_CHAR_LENGTH = 256
OB_MAX_MYSQL_VARCHAR_LENGTH = 65535(2¹⁶-1,兼容 MySQL)
OB_MAX_VARCHAR_LENGTH = 1048576(2²⁰,OceanBase 扩展为 1MB)
OB_MAX_BINARY_LENGTH = 255
OB_MAX_VARBINARY_LENGTH = 65536(2¹⁶)
六、大文本 / LOB 类型 (Text and Blob Types)
| 数据类型 | SQL 声明 | 内部类型 | 最大长度 | 说明 |
|---|
| TINYTEXT | TINYTEXT | ObTinyTextType (27) | 2⁸ 字节 | 短文本 |
| TEXT | TEXT | ObTextType (28) | 2¹⁶ 字节 (64KB) | 中等文本 |
| MEDIUMTEXT | MEDIUMTEXT | ObMediumTextType (29) | 2²⁴ 字节 (16MB) | 长文本 |
| LONGTEXT | LONGTEXT | ObLongTextType (30) | 2²⁹-1 字节 (~512MB) | 超长文本 |
| TINYBLOB | TINYBLOB | ObTinyTextType (binary) | 2⁸ 字节 | 短二进制 |
| BLOB | BLOB | ObTextType (binary) | 2¹⁶ 字节 (64KB) | 中等二进制 |
| MEDIUMBLOB | MEDIUMBLOB | ObMediumTextType (binary) | 2²⁴ 字节 (16MB) | 长二进制 |
| LONGBLOB | LONGBLOB | ObLongTextType (binary) | 2²⁹-1 字节 (~512MB) | 超长二进制 |
源码常量:
OB_MAX_TINYTEXT_LENGTH = 256 (2⁸)
OB_MAX_TEXT_LENGTH = 65536 (2¹⁶)
OB_MAX_MEDIUMTEXT_LENGTH = 16777216 (2²⁴)
OB_MAX_LONGTEXT_LENGTH = 536870911(2²⁹-1,因为 datum.len_ 只有 29 bit)
- 注意:OceanBase 的 LONGTEXT 最大长度为 ~512MB,而 MySQL 原生为 4GB
七、位类型 (Bit Type)
| 数据类型 | SQL 声明 | 内部类型 | 存储大小 | 取值范围 |
|---|
| BIT | BIT(M) | ObBitType (31) | 1~8 字节 | M=1~64 位 |
源码常量:OB_MAX_BIT_LENGTH = 64
八、枚举和集合类型 (Enum and Set Types)
| 数据类型 | SQL 声明 | 内部类型 | 存储大小 | 说明 |
|---|
| ENUM | ENUM('val1','val2',...) | ObEnumType (32) | 1~2 字节 | 单选枚举 |
| SET | SET('val1','val2',...) | ObSetType (33) | 1~8 字节 | 多选集合 |
源码常量:
OB_MAX_ENUM_ELEMENT_NUM = 65535(枚举值最大数量)
OB_MAX_SET_ELEMENT_NUM = 64(集合值最大数量)
九、JSON 类型
| 数据类型 | SQL 声明 | 内部类型 | 存储大小 | 说明 |
|---|
| JSON | JSON | ObJsonType (47) | 变长 (最大 ~512MB) | JSON 文档 |
JSON 类型与 LONGTEXT 共享 LOB 存储
十、空间类型 (Geometry Types)
| 数据类型 | SQL 声明 | 内部类型 | 说明 |
|---|
| GEOMETRY | GEOMETRY | ObGeometryType (48) | 空间几何数据(父类型) |
| POINT | POINT | ObGeometryType (sub:1) | 点 |
| LINESTRING | LINESTRING | ObGeometryType (sub:2) | 线 |
| POLYGON | POLYGON | ObGeometryType (sub:3) | 多边形 |
| MULTIPOINT | MULTIPOINT | ObGeometryType (sub:4) | 多点 |
| MULTILINESTRING | MULTILINESTRING | ObGeometryType (sub:5) | 多线 |
| MULTIPOLYGON | MULTIPOLYGON | ObGeometryType (sub:6) | 多多边形 |
| GEOMETRYCOLLECTION | GEOMETRYCOLLECTION | ObGeometryType (sub:7) | 几何集合 |
源码枚举 ObGeoType 定义了所有子类型
十一、特殊 / 内部类型
| 内部类型 | 编号 | 说明 |
|---|
| ObNullType | 0 | 空值 |
| ObExtendType | 25 | 内部扩展类型(Min, Max, NOP 等) |
| ObUnknownType | 26 | 预编译语句中的问号 ? 占位符 |
| ObEnumInnerType | 34 | ENUM 内部存储类型 |
| ObSetInnerType | 35 | SET 内部存储类型 |
与 MySQL 官方的差异
| 维度 | MySQL 8.0 | OceanBase 4.2.5 |
|---|
| VARCHAR 最大长度 | 2¹⁶-1 字节 (65,535) | 2²⁰ 字节 (1MB) |
| LONGTEXT 最大长度 | 2³²-1 字节 (4GB) | 2²⁹-1 字节 (~512MB) |
| CHAR 最大长度 | 255 字符 | 256 字符 |
| DECIMAL 最大精度 | 65 位 | 65 位(一致) |
| FLOAT 精度 | 0~23 (单精度) | 最大 24 |
| DOUBLE 精度 | 24~53 (双精度) | 最大 53 |
| YEAR 范围 | 1901~2155 | 1901~2155(一致) |
| JSON | 支持 | 支持(LOB 存储) |
| Geometry | 支持 | 支持 |
| BOOLEAN | TINYINT(1) 别名 | TINYINT 别名(一致) |