---
title: "表达式求值的类型转换 - OceanBase 数据库 V4.3.0 | OceanBase 文档中心"
description: 表达式求值的类型转换 当表达式中的运算符与不同类型的操作数一起使用时，会发生数据类型转换以使操作数兼容。 转换方式 OceanBase 数据库支持显式数据类型转换和隐式数据类型转换。 隐式数据类型转换发生在这样的场景中：一个操作需要一个指定数据类型的参数，但语句的实际参数值并不是指定数据类型，这时 OceanBase…
---
切换语言

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

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

# 表达式求值的类型转换

更新时间：2026-04-10 11:58:35

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/100.basic-elements-of-mysql-mode/200.expression-of-mysql-mode/300.type-conversion-of-expression-evaluation-of-mysql-mode.md)  

当表达式中的运算符与不同类型的操作数一起使用时，会发生数据类型转换以使操作数兼容。

## 转换方式

OceanBase 数据库支持显式数据类型转换和隐式数据类型转换。

隐式数据类型转换发生在这样的场景中：一个操作需要一个指定数据类型的参数，但语句的实际参数值并不是指定数据类型，这时 OceanBase 数据库会将实际参数值转为指定数据类型后，再进行后续操作。

如下例所示，OceanBase 数据库会根据需要自动将字符串转换为数字，反之亦然。

```sql
obclient> SELECT 1+'1';
+-------+
| 1+'1' |
+-------+
|     2 |
+-------+
1 row in set

```

OceanBase 数据库的显示数据类型转换通过 `CAST` 函数实现。如下例所示：

```sql
obclient> SELECT 31.4, CAST(31.4 AS TIME);
+------+--------------------+
| 31.4 | CAST(31.4 AS TIME) |
+------+--------------------+
| 31.4 | 00:00:31           |
+------+--------------------+
1 row in set

```

有关 CAST 函数的相关信息，请参见 [CAST](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000644357)。

## 转换规则

### 比较运算的转换规则

- 如果一个或两个参数为 `NULL`，则比较结果为 `NULL`，但 `<=>` 比较运算符除外。对于 `NULL <=> NULL`，结果为真，不需要转换。
 - 如果比较运算中的两个参数都是字符串，则将它们作为字符串进行比较。
 - 如果两个参数都是整数，则将它们作为整数进行比较。
 - 如果不与数字进行比较，十六进制值将被视为二进制字符串。
 - 来自一个或多个表的单行子查询不被视为常量。例如，如果子查询返回的整数要与 `DATETIME` 值进行比较，则将两个操作数作为整数进行。由于整数不会被转换为时间值，所以要将操作数作为 `DATETIME` 值进行比较，请使用 `CAST()` 将子查询值显式转换为 `DATETIME`。

  如果其中一个参数是 `TIMESTAMP` 或 `DATETIME` 列，而另一个参数是常量，则在执行比较之前，该常量将转换为时间戳。为安全起见，在进行比较时始终使用完整的日期时间、日期或时间字符串。例如，在 `BETWEEN` 与日期或时间值一起使用时，要想获得最佳结果，请使用 `CAST()` 将值显式转换为所需的数据类型。
 - 如果其中一个参数是十进制值，则比较类型取决于另一个参数。如果另一个参数是十进制或整数值，则将参数作为十进制值进行比较，如果另一个参数是浮点值，则作为浮点值进行比较。
 - 除上述以外的情况，参数将作为浮点（实数）数进行比较。例如，字符串和数字操作数的比较是作为浮点数的比较进行的。

  浮点数和 `INTEGER` 类型的大值之间的比较是近似的，因为整数在比较之前被转换为双精度浮点数，无法准确表示所有 64 位整数。

### 其他相关转换规则

- 从字符串到浮点数和从整数到浮点数的转换方式不一定相同。结果可能会受到编译器版本等因素的影响。避免此类问题的一种方法是使用 `CAST()` 以防止该值不会隐式转换为浮点数。
 - 将数值或时间值隐式转换为字符串会产生一个值，该值具有由 `character_set_connection` 和 `collation_connection` 系统变量确定的字符集和字符序。

  这意味着此类转换会生成非二进制字符串（`CHAR`、`VARCHAR` 或 `LONGTEXT` 值），如果将连接字符集设置为二进制，则转换结果是二进制字符串（`BINARY`、`VARBINARY` 或 `LONGBLOB` 值）。
 - 对于整数表达式求值时的类型转换有些不同。例如，表达式生成的列中的表具有 `INT` 或 `BIGINT` 类型，如下所示：

  ```sql
  CREATE TABLE t SELECT integer_expr;

  ```

  如果表达式的最大长度不适合 `INT`，则使用 `BIGINT`。但可以通过使用足够长的表达式来强制使用 `BIGINT` 而不是 `INT`：

  ```sql
  obclient> CREATE TABLE t SELECT 000000000000000000000;
  Query OK, 1 row affected

  ```

 上一篇 下一篇 ![有帮助](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) 咨询热线
