基础数据类型

更新时间:

本文介绍云原生数据仓库 AnalyticDB MySQL 版支持哪些数据类型,与MySQL数据类型的差异对比以及隐式转换规则。

AnalyticDB for MySQL支持的基础数据类型

类型

数据类型

说明

MySQL数据类型差异

数值类型

BOOLEAN布尔类型

值只能是01,存储字节数1比特位。

  • 取值0的逻辑意义为假。

  • 取值1的逻辑意义为真。

一致。

TINYINT微整数类型

取值范围-128~127,存储字节数1字节。

一致。

SMALLINT小整数类型

取值范围-32768~32767,存储字节数2字节。

一致。

INTINTEGER整数类型

取值范围-2147483648~2147483647,存储字节数4字节。

AnalyticDB for MySQL中的int对应MySQL中的int或者mediumint

BIGINT大整数类型

取值范围-9223372036854775808~9223372036854775807,存储字节数8字节。

一致。

FLOAT单精度浮点数

取值范围-3.402823466E+38~-1.175494351E-38, 0, 1.175494351E-38~3.402823466E+38,IEEE标准,存储字节数4字节。

一致。

DOUBLE双精度浮点数

取值范围-1.7976931348623157E+308~-2.2250738585072014E-308, 0, 2.2250738585072014E-308~1.7976931348623157E+308,IEEE标准,存储字节数8字节。

一致。

DECIMAL(m,d)NUMERIC

m是数值的最大精度,取值范围为1~1000d是小数点右侧数字的位数,要求dm

  • MySQL支持的最大精度为65

  • AnalyticDB for MySQL支持的最大精度为1000

字符类型

VARCHAR变长字符串类型

存储字节数最大为16MB,使用时无需指定存储长度。

说明

若您指定存储长度VARCHAR(255),括号中的数字仅用于语法兼容,实际可以存储超过255个字符,由数据本身决定(最大16MB)。请勿依赖该参数进行长度校验。

AnalyticDB for MySQL中的varchar对应MySQL中的charvarchartextmediumtext或者longtext

BINARY二进制字符串类型

存储字符长度。

AnalyticDB for MySQL中的binary对应MySQL中的binaryvarbinary或者blob

时间类型

DATE日期类型

取值范围'0001-01-01'~'9999-12-31',支持的数据格式为'YYYY-MM-DD',存储字节数为4字节。

  • MySQL支持0000-00-00

  • AnalyticDB for MySQL对时间类型的数值会进行合法性校验。当写入不合理的数值时,例如0000-00-00AnalyticDB for MySQL会自动将其转化为NULL。请确保写入的日期和时间有意义。

TIME时间类型

取值范围'00:00:00'~'23:59:59',支持的数据格式为'HH:MM:SS',存储字节数为8字节。

  • MySQL支持自定义精度。

  • AnalyticDB for MySQL支持的精度为毫秒,即小数点后三位。

DATETIME时间戳类型

取值范围'0001-01-01 00:00:00.000'UTC~'9999-12-31 23:59:59.999'UTC,支持的数据格式为'YYYY-MM-DD HH:MM:SS',存储字节数为8字节。

重要

datetime默认UTC时间,且不支持更改。

  • MySQL支持0000-00-00,支持自定义精度。

  • AnalyticDB for MySQL对时间类型的数值会进行合法性校验。当写入不合理的数值时,例如0000-00-00AnalyticDB for MySQL会自动将其转化为NULL。请确保写入的日期和时间有意义。

TIMESTAMP时间戳类型

时间戳类型,取值范围'0100-01-01 00:00:00.000'UTC~'9999-12-31 23:59:59.999'UTC,支持的数据格式为'YYYY-MM-DD HH:MM:SS',存储字节数为8字节。

说明

TIMESTAMP默认为系统时区,可以在SESSION中设置时区。

  • MySQL支持自定义精度。

  • AnalyticDB for MySQL支持的精度为毫秒,即小数点后三位。

空间类型

POINT

地理坐标,由坐标经度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'。这种优化策略可将比较逻辑下推至存储层,有效减少数据扫描量,提升查询性能。