基础数据类型
本文介绍云原生数据仓库 AnalyticDB MySQL 版支持哪些数据类型,与MySQL数据类型的差异对比以及隐式转换规则。
AnalyticDB for MySQL支持的基础数据类型
类型 | 数据类型 | 说明 | 与MySQL数据类型差异 |
数值类型 |
| 值只能是
| 一致。 |
| 取值范围 | 一致。 | |
| 取值范围 | 一致。 | |
| 取值范围 | AnalyticDB for MySQL中的 | |
| 取值范围 | 一致。 | |
| 取值范围 | 一致。 | |
| 取值范围 | 一致。 | |
|
|
| |
字符类型 |
| 存储字节数最大为16MB,使用时无需指定存储长度。 说明 若您指定存储长度VARCHAR(255),括号中的数字仅用于语法兼容,实际可以存储超过255个字符,由数据本身决定(最大16MB)。请勿依赖该参数进行长度校验。 | AnalyticDB for MySQL中的 |
| 存储字符长度。 | AnalyticDB for MySQL中的 | |
时间类型 |
| 取值范围 |
|
| 取值范围 |
| |
| 取值范围 重要
|
| |
| 时间戳类型,取值范围 说明
|
| |
空间类型 |
| 地理坐标,由坐标经度x和纬度y组成。 | 一致。 |
隐式类型转换
隐式类型转换是指在执行SQL查询操作时,由AnalyticDB for MySQL依据上下文使用环境及类型转换规则自动进行的类型转换。
投影转换规则
SELECT语句中的列与常量比较,返回类型会被隐式转换为表格中的数据类型。如果存在不支持隐式转换的场景,会提示不支持此类转换报错。
列/常量 | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
VARCHAR | VARCHAR | BOOLEAN | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
BOOLEAN | BOOLEAN | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | 不支持 | DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
TINYINT | BIGINT | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
SMALLINT | BIGINT | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
INTEGER | BIGINT | INTEGER | INTEGER | INTEGER | INTEGER | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
DECIMAL | DECIMAL | 不支持 | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
TIME | TIME | 不支持 | 不支持 | 不支持 | BIGINT | BIGINT | 不支持 | DOUBLE | TIME | BIGINT | BIGINT | DATETIME |
DATE | DATE | 不支持 | 不支持 | 不支持 | BIGINT | BIGINT | 不支持 | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
TIMESTAMP | TIMESTAMP | 不支持 | 不支持 | 不支持 | BIGINT | BIGINT | 不支持 | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
DATETIME | DATETIME | 不支持 | 不支持 | 不支持 | BIGINT | BIGINT | 不支持 | DOUBLE | DATETIME | DATETIME | DATETIME | DATETIME |
过滤转换规则
WHERE子句中的列与常量比较,返回类型会被隐式转换为表格中的数据类型。如果存在不支持隐式转换的场景,会提示不支持此类转换报错。
比较类型不一致,隐式类型转换时可能会出现无法下推的情况,触发全表扫描操作,显著降低查询性能。其中,下推是指过滤条件下推到存储层,通过索引匹配过滤,在过滤度高的时候减少数据扫描,从而提升查询性能。
下表中,返回数据类型前的1
代表可以下推,0
代表不能下推。
列/常量 | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | REAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
VARCHAR | 1 VARCHAR | 0 BOOLEAN | 0 BIGINT | 0 BIGINT | 0 BIGINT | 0 BIGINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 0 TIME | 0 DATE | 0 TIMESTAMP | 0 DATETIME |
BOOLEAN | 1 BOOLEAN | 1 BOOLEAN | 0 TINYINT | 0 SMALLINT | 0 INTEGER | 0 BIGINT | 不支持 | 0 REAL | 0 DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 0 DECIMAL | 0 REAL | 0 DOUBLE | 1 INTEGER | 1 INTEGER | INTEGER | INTEGER |
BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 1 BIGINT | 1 BIGINT | BIGINT | BIGINT |
DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 0 REAL | 0 DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 0 DOUBLE | 不支持 | 不支持 | 不支持 | 不支持 |
DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE |
TIME | 1 TIME | 不支持 | 不支持 | 不支持 | 0 BIGINT | 0 BIGINT | 不支持 | 不支持 | 0 DOUBLE | 1 TIME | 0 BIGINT | 0 BIGINT | 0 DATETIME |
DATE | 1 DATE | 不支持 | 不支持 | 不支持 | 0 BIGINT | 0 BIGINT | 不支持 | 不支持 | 0 DOUBLE | 0 BIGINT | 1 DATE | 0 TIMESTAMP | 0 DATETIME |
TIMESTAMP | 1 TIMESTAMP | 不支持 | 不支持 | 不支持 | 0 BIGINT | 0 BIGINT | 不支持 | 不支持 | 0 DOUBLE | 1 TIMESTAMP | 1 TIMESTAMP | 1 TIMESTAMP | 1 TIMESTAMP |
DATETIME | 1 DATETIME | 不支持 | 不支持 | 不支持 | 0 BIGINT | 0 BIGINT | 不支持 | 不支持 | 0 DOUBLE | 1 DATETIME | 1 DATETIME | 1 DATETIME | 1 DATETIME |
强制类型转换优化(ENFORCE_UNWRAP_CAST)
强制类型转换优化是数据库系统中用于控制类型转换策略的优化机制,旨在解决因隐式类型转换导致的查询性能下降和结果准确性问题。
配置方式
强制类型转换优化支持两种配置方式,可根据业务需求灵活选择。
全局配置
通过设置全局参数开启优化,适用于所有查询。
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true;
通过Hint方式配置
针对特定查询临时启用优化,不影响其他查询。
/*+ ENFORCE_UNWRAP_CAST=true */
示例
假设test
表中col
列为VARCHAR类型,该列包含值'1'
、'1a'
、'abc'
。执行如下查询语句:
SELECT col FROM test WHERE col = 1;
根据enforce_unwrap_cast
配置状态不同,需特别注意结果变化:
默认关闭状态(
ENFORCE_UNWRAP_CAST=false
):系统将VARCHAR列隐式转换为BIGINT类型进行比较。此时'1'
和'1a'
均会被截断,非数字部分转换为数值1参与比较,最终返回两个匹配结果'1'
和'1a'
。由于该隐式转换发生在列值层面,导致无法触发下推优化,系统需要扫描全表。此时,查询性能会降低。开启状态(
ENFORCE_UNWRAP_CAST=true
):系统将INTEGER常量转换为VARCHAR类型进行字符串比较。此时只有'1'
能与常量1
完全匹配,'1a'
因字符串不匹配而被过滤,最终仅返回一个匹配结果'1'
。这种优化策略可将比较逻辑下推至存储层,有效减少数据扫描量,提升查询性能。