📣TiDB Cloud BYOC、TiDB Cloud Filesystem 和 PostgreSQL-compatible TiDB Cloud Starter 全新发布,开放公测中。此页面由 AI 自动翻译,英文原文请见此处。

Cast Functions and Operators



Cast 函数和操作符可以实现值从一种数据类型到另一种数据类型的转换。 TiDB 支持所有在 MySQL 8.0 中可用的 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)十进制数,n 和 m 为可选,默认为 10 和 0否
DOUBLE双精度浮点数否
FLOAT(n)浮点数,n 为可选,范围在 0 到 53 之间否
JSONJSON否
REAL浮点数是
SIGNED [INTEGER]有符号整数是
TIME(fsp)时间是
UNSIGNED [INTEGER]无符号整数是
VECTOR向量否
YEAR年份否

示例:

以下语句将十六进制字面量的二进制字符串转换为 CHAR。

SELECT CAST(0x54694442 AS CHAR);
+--------------------------+ | CAST(0x54694442 AS CHAR) | +--------------------------+ | TiDB | +--------------------------+ 1 行,耗时 0.0002 秒

以下语句将从 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. 行 *************************** id: IndexMerge_10 estRows: 2.00 task: root 访问对象: 操作符信息: type: union *************************** 2. 行 *************************** id: ├─IndexRangeScan_8(Build) estRows: 2.00 task: cop[tikv] 访问对象: table:t, index:idx_a(cast(json_extract(`j`, _utf8mb4'$.a') as unsigned array)) 操作符信息: range:[1,1], keep order:false, stats:partial[j:unInitialized] *************************** 3. 行 *************************** id: └─TableRowIDScan_9(Probe) estRows: 2.00 task: cop[tikv] 访问对象: table:t 操作符信息: keep order:false, stats:partial[j:unInitialized] 3 行,耗时 0.00 秒

CONVERT

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

示例:

SELECT CONVERT(0x616263 USING utf8mb4);
+---------------------------------+ | CONVERT(0x616263 USING utf8mb4) | +---------------------------------+ | abc | +---------------------------------+ 1 行,耗时 0.0004 秒

MySQL 兼容性

  • TiDB 不支持对 SPATIAL 类型的 cast 操作。更多信息请参见 #6347。
  • TiDB 不支持 CAST() 中的 AT TIME ZONE。更多信息请参见 #51742。
  • CAST(24 AS YEAR) 在 TiDB 中返回 2 位数字,在 MySQL 中返回 4 位数字。更多信息请参见 #29629。

文档内容是否有帮助?