Cast 函数和操作符

Cast 函数和操作符用于将某种数据类型的值转换为另一种数据类型。TiDB 支持使用 MySQL 8.0 中提供的所有 Cast 函数和操作符

Cast 函数和操作符表

函数和操作符名功能描述
BINARY将一个字符串转换成一个二进制字符串
CAST()将一个值转换成一个确定类型
CONVERT()将一个值转换成一个确定类型

BINARY

BINARY 运算符从 MySQL 8.0.27 版本起已被废弃。建议在 TiDB 和 MySQL 中都改用 CAST(... AS BINARY)

CAST

CAST(<expression> AS <type> [ARRAY]) 函数用于将一个表达式的值转换为指定的数据类型。

此外,你还可以将该函数用于创建多值索引

支持的数据类型包括:

类型描述是否可用于多值索引
BINARY(n)二进制字符串
CHAR(n)字符串是,但仅当指定了长度时才有效
DATE日期
DATETIME(fsp)日期/时间,其中 fsp 是可选的
DECIMAL(n, m)十进制数,其中 nm 是可选的,如果未指定,则默认为 100
DOUBLE双精度浮点数
FLOAT(n)浮点数,其中 n 是可选的,应介于 053 之间
JSONJSON
REAL浮点数
SIGNED [INTEGER]有符号整数
TIME(fsp)时间
UNSIGNED [INTEGER]无符号整数
YEAR

示例:

以下语句将二进制字符串从十六进制文字转换为 CHAR

SELECT CAST(0x54694442 AS CHAR);
+--------------------------+ | CAST(0x54694442 AS CHAR) | +--------------------------+ | TiDB | +--------------------------+ 1 row in set (0.0002 sec)

以下语句将从 JSON 列中提取的 a 属性的值转换为无符号数组。需要注意的是,该函数只有作为多值索引定义的一部分时,才支持将数据转换为数组。

CREATE TABLE t ( id INT PRIMARY KEY, j JSON, INDEX idx_a ((CAST(j->'$.a' AS UNSIGNED ARRAY))) ); INSERT INTO t VALUES (1, JSON_OBJECT('a',JSON_ARRAY(1,2,3))); INSERT INTO t VALUES (2, JSON_OBJECT('a',JSON_ARRAY(4,5,6))); INSERT INTO t VALUES (3, JSON_OBJECT('a',JSON_ARRAY(7,8,9))); ANALYZE TABLE t;
EXPLAIN SELECT * FROM t WHERE 1 MEMBER OF(j->'$.a')\G *************************** 1. row *************************** id: IndexMerge_10 estRows: 2.00 task: root access object: operator info: type: union *************************** 2. row *************************** id: ├─IndexRangeScan_8(Build) estRows: 2.00 task: cop[tikv] access object: table:t, index:idx_a(cast(json_extract(`j`, _utf8mb4'$.a') as unsigned array)) operator info: range:[1,1], keep order:false, stats:partial[j:unInitialized] *************************** 3. row *************************** id: └─TableRowIDScan_9(Probe) estRows: 2.00 task: cop[tikv] access object: table:t operator info: keep order:false, stats:partial[j:unInitialized] 3 rows in set (0.00 sec)

CONVERT

CONVERT() 函数用于在字符集之间进行转换。

示例:

SELECT CONVERT(0x616263 USING utf8mb4);
+---------------------------------+ | CONVERT(0x616263 USING utf8mb4) | +---------------------------------+ | abc | +---------------------------------+ 1 row in set (0.0004 sec)

MySQL 兼容性

  • TiDB 不支持对空间类型 (SPATIAL) 进行转换操作。更多信息,请参考 #6347
  • TiDB 不支持在 CAST() 中使用 AT TIME ZONE。更多信息,请参考 #51742
  • CAST(24 AS YEAR) 在 TiDB 中返回的结果为两位数字,而在 MySQL 中返回的结果为四位数字。更多信息,请参考 #29629