---
title: "CAST - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: CAST 声明 CAST(expr AS type) 说明 CAST() 将某种数据类型的表达式显式转换为另一种数据类型，即将 expr 字段值转换为 type 数据类型。 参数说明 参数解释如下： expr ：表示任何有效的 SQL 表达式。 AS ：用于分隔两个参数，在 AS 之前的是要处理的数据，在 AS 之后…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# CAST

更新时间：2026-07-15 15:16:39

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/400.functions-of-mysql-mode/200.single-row-functions-of-mysql-mode/300.conversion-functions-of-mysql-mode/100.cast-of-mysql-mode.md)  

## 声明

```sql
CAST(expr AS type)

```

## 说明

`CAST()` 将某种数据类型的表达式显式转换为另一种数据类型，即将 `expr` 字段值转换为 `type` 数据类型。

### 参数说明

参数解释如下：

- `expr`：表示任何有效的 SQL 表达式。
 - `AS`：用于分隔两个参数，在 `AS` 之前的是要处理的数据，在 `AS` 之后是要转换的数据类型。
 - `type`：表示目标系统所提供的数据类型。支持如下类型：

     - `CHAR[(N)] [CHARACTER SET charset_name]`

      生成具有 `CHAR` 数据类型的字符串。除了当表达式 `expr` 为空（长度为 0）时，结果类型为 `CHAR(0)`。如果指定了可选长度 `N`，`CHAR(N)` 会强制转换为使用不超过 `N` 个参数的字符，短于 `N` 个字符长度的值不会发生填充；如果没有指定可选长度 `N`，OceanBase 数据库会根据表达式计算最大长度。如果没有 `CHARACTER SET charset_name` 子句，`CHAR` 会生成具有默认字符集的字符串。
     - `DATE`：产生一个 `DATE` 值。
     - `DATETIME [ (M) ]`：产生一个 `DATETIME` 值。`M` 值是可选的，用于指定小数位上秒的精度，范围为 [0,6]。
     - `DECIMAL [ (M [,D] ) ]`：产生一个 `DECIMAL` 值。`M` 和 `D` 值是可选的，它们分别指定最大位数（精度）和小数点后的位数（小数位数）。`M` 最大值为 65，`D` 最大值为 30。如果省略 `D`，则默认为 `0`; 如果省略 `M`，则默认为 `10`。
     - `SIGNED [INTEGER]`：产生一个有符号的 `BIGINT` 值。
     - `JSON`：生成 `JSON` 值。有关 JSON 与其他类型的值转换规则，请参见 [JSON 数据类型转换](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005688107)。
     - `TIME [ (M) ]`：产生一个 `TIME` 值。如果给出了可选的 M 值，则它指定小数位上秒的精度。
     - `UNSIGNED [INTEGER]`：产生一个无符号的 `BIGINT` 值。
     - `DECIMAL(m,d)` ：定点数类型，`m` 表示总位数，`d` 表示小数位数。
     - `FLOAT`：表示单精度浮点数，适用于近似数值。
     - `BIGINT`：用于将表达式 `expr` 的值显式转换为 `BIGINT` 类型。

      #### 说明

      该类型从 V4.6.0 版本开始引入。
     - `INT` 或 `INTEGER`：表示 32 位有符号的整数。
     - `SMALLINT`：表示 16 位有符号的整数。
     - `TINYINT`：表示 8 位有符号整数。
     - `ARRAY`：用于将 `JSON` 数组中的元素转换为特定类型的数组。支持 `ARRAY<元素类型>` 格式声明数组元素类型，同时支持嵌套数组，如 `ARRAY<ARRAY<INT>>`，可用于表示多维数组结构。

### 使用说明

在使用 `CAST` 函数进行数据类型转换时，支持以下情况：

- 两个表达式的数据类型完全相同
 - 两个表达式可隐式转换
 - 必须显式转换数据类型。
 - 表达式 expr 的数值超过目标数据类型的数值范围时，类型转换会返回 `null`。
 - 将高精度数据类型转换为低精度的数据类型，会丢失精度。
 - 将定点数（`DECIMAL(m,d)`）、浮点数（`DOUBLE`、`FLOAT`）转换为整数（`INT`/`INTEGER`、`SMALLINT` 或 `TINYINT`），会丢失精度。
 - 如果表达式 expr 是 `VARCHAR` 类型，且不是数值，转换为 `INT`/`INTEGER`、`SMALLINT` 或 `TINYINT` 类型，返回结果为`0`。
 - 如果表达式 expr 是 JSON 类型，且不是数值，转换为 `INT`/`INTEGER`、`SMALLINT` 或 `TINYINT` 类型，返回报错。
 - 如果 `VARCHAR` 数据或 `JSON` 数据不符合 `ARRAY` 格式，转换时会报错。

当用户试图进行不可能的转换，OceanBase 数据库将显示一条错误信息。如果转换时没有指定数据类型的长度，则使用 OceanBase 数据库系统内部最大长度。例如 `VARCHAR` 是 262,143 字节，`NUMBER` 是 65 比特位的浮动精度。

`CAST()` 支持带符号和无符号的 64 比特值的运算。如果您正在使用数字操作符 (例如 `+`) 而其中一个操作数为无符号整数，则结果为无符号。您可以使用 `SIGNED` 和 `UNSIGNED` 对结果进行显式声明，将运算分别指定为带符号或无符号的 64 比特位的整数。如果任意一个操作数为一个浮点值，则结果为一个浮点值。

## 示例

- 将数值 0 转换为 `DATE` 类型。

  ```sql
  obclient> SELECT CAST(0 AS DATE);
  +-----------------+
  | CAST(0 AS DATE) |
  +-----------------+
  | 0000-00-00      |
  +-----------------+
  1 row in set

  ```
 - 将数值 123 转换为 `TIME` 类型。

  ```sql
  obclient> SELECT CAST(123 AS TIME);
  +-------------------+
  | CAST(123 AS TIME) |
  +-------------------+
  | 00:01:23          |
  +-------------------+
  1 row in set

  ```
 - 将数值 123 转换为 `DATETIME` 类型。

  ```sql
  obclient> SELECT CAST(123 AS DATETIME(4));
  +--------------------------+
  | CAST(123 AS DATETIME(4)) |
  +--------------------------+
  | 2000-01-23 00:00:00.0000 |
  +--------------------------+
  1 row in set

  ```
 - 将数值 123 转换为 `DECIMAL` 类型。

  ```sql
  obclient>  SELECT CAST(123 AS DECIMAL(3,2));
  +---------------------------+
  | CAST(123 AS DECIMAL(3,2)) |
  +---------------------------+
  |                      9.99 |
  +---------------------------+
  1 row in set

  ```
 - 将字符串文本 "123" 转换为 JSON 类型。

  ```sql
  obclient> SELECT CAST("123" AS JSON);
  +---------------------+
  | CAST("123" AS JSON) |
  +---------------------+
  | 123                 |
  +---------------------+
  1 row in set

  ```
 - 将 "1-2"的结果分别使用无符号表示和有符号表示。

  ```sql
  obclient> SELECT CAST(1-2 AS UNSIGNED), CAST(cast(1-2 AS UNSIGNED) AS SIGNED);
  +-----------------------+---------------------------------------+
  | CAST(1-2 AS UNSIGNED) | CAST(cast(1-2 AS UNSIGNED) AS SIGNED) |
  +-----------------------+---------------------------------------+
  |  18446744073709551615 |                                    -1 |
  +-----------------------+---------------------------------------+
  1 row in set

  ```
 - 使用 `CAST()` 进行数值运算。

  ```sql
  obclient> SELECT CAST(1 AS UNSIGNED) - 2.0;
  +---------------------------+
  | CAST(1 AS UNSIGNED) - 2.0 |
  +---------------------------+
  |                      -1.0 |
  +---------------------------+
  1 row in set

  ```
 - 将数值 123 转换为 `CHAR` 类型。

  ```sql
  obclient> SELECT CAST(123 AS CHAR(2));
  +----------------------+
  | CAST(123 AS CHAR(2)) |
  +----------------------+
  | 12                   |
  +----------------------+
  1 row in set

  ```
 - 将数值 1 转换为 `CHAR` 类型并指定字符集。

  ```sql
  obclient> SELECT CAST(1 AS CHAR CHARACTER SET utf8mb4);
  +---------------------------------------+
  | CAST(1 AS CHAR CHARACTER SET utf8mb4) |
  +---------------------------------------+
  | 1                                     |
  +---------------------------------------+
  1 row in set

  ```
 - 将字符型 `123` 转化为整型、整数 `1` 转化为 `INT` 类型。

  ```sql
  obclient> SELECT CAST('123' AS INT),CAST(1 AS CHAR(10));
  +--------------------+---------------------+
  | CAST('123' AS INT) | CAST(1 AS INT) |
  +--------------------+---------------------+
  |                123 | 1                   |
  +--------------------+---------------------+
  1 row in set (0.035 sec

  ```
 - 将 `JSON` 类型的数据[1,2,3]转换 `ARRAY` 数据，其中 `ARRAY` 数据由 `INT` 类型构成，语句如下：

  ```sql
  obclient> SELECT CAST('[1,2,3]' AS ARRAY<INT>);
  +-------------------------------------+
  | CAST('[1,2,3]' AS ARRAY<INT> |
  +-------------------------------------+
  | [1,2,3]                             |
  +-------------------------------------+
  1 row in set

  ```
 - 将 `JSON` 类型的嵌套数组 `[[1,2],[3,4]]` 转换为嵌套 `ARRAY<ARRAY<INT>>` 数据，语句如下：

  ```sql
  obclient> SELECT CAST('[[1,2],[3,4]]' AS ARRAY<ARRAY<INT>>);
  +--------------------------------------------+
  | CAST('[[1,2],[3,4]]' AS ARRAY<ARRAY<INT>>) |
  +--------------------------------------------+
  | [[1,2],[3,4]]                              |
  +--------------------------------------------+
  1 row in set

  ```
 - 将浮点数 `123.456` 转换为 `BIGINT` 类型。

  ```shell
  obclient> SELECT CAST(123.456 AS BIGINT);

  ```

  返回结果如下：

  ```shell
  +-------------------------+
  | CAST(123.456 AS BIGINT) |
  +-------------------------+
  |                     123 |
  +-------------------------+
  1 row in set

  ```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
