| title | Cast 函数和操作符 | ||
|---|---|---|---|
| aliases |
|
||
| summary | Cast 函数和操作符用于将某种数据类型的值转换为另一种数据类型。TiDB 支持使用 MySQL 8.0 中提供的所有 Cast 函数和操作符。 |
Cast 函数和操作符用于将某种数据类型的值转换为另一种数据类型。TiDB 支持使用 MySQL 8.0 中提供的所有 Cast 函数和操作符。
| 函数和操作符名 | 功能描述 |
|---|---|
BINARY |
将一个字符串转换成一个二进制字符串 |
CAST() |
将一个值转换成一个确定类型 |
CONVERT() |
将一个值转换成一个确定类型 |
注意:
TiDB 和 MySQL 对于
SELECT CAST(MeN AS CHAR)(或者等价的SELECT CONVERT(MeM, CHAR))的结果显示不一致,其中MeN是用科学计数法表示的双精度浮点数。MySQL 在-15 <= N <= 14时显示完整数值,在N < -15或N > 14时显示科学计数法。而 TiDB 始终显示完整数值。例如,MySQL 对于SELECT CAST(3.1415e15 AS CHAR)的显示结果为3.1415e15,而 TiDB 的显示结果为3141500000000000。
BINARY 运算符从 MySQL 8.0.27 版本起已被废弃。建议在 TiDB 和 MySQL 中都改用 CAST(... AS BINARY)。
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 之间 |
否 |
JSON |
JSON | 否 |
REAL |
浮点数 | 是 |
SIGNED [INTEGER] |
有符号整数 | 是 |
TIME(fsp) |
时间 | 是 |
UNSIGNED [INTEGER] |
无符号整数 | 是 |
VECTOR |
向量 | 否 |
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)示例:
SELECT CONVERT(0x616263 USING utf8mb4);+---------------------------------+
| CONVERT(0x616263 USING utf8mb4) |
+---------------------------------+
| abc |
+---------------------------------+
1 row in set (0.0004 sec)