首批通过分布式安全可靠测评,为关键业务系统打造
CAST
更新时间:2026-06-15 12:45:48
声明
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 数据类型转换。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类型。obclient> SELECT CAST(0 AS DATE); +-----------------+ | CAST(0 AS DATE) | +-----------------+ | 0000-00-00 | +-----------------+ 1 row in set将数值 123 转换为
TIME类型。obclient> SELECT CAST(123 AS TIME); +-------------------+ | CAST(123 AS TIME) | +-------------------+ | 00:01:23 | +-------------------+ 1 row in set将数值 123 转换为
DATETIME类型。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类型。obclient> SELECT CAST(123 AS DECIMAL(3,2)); +---------------------------+ | CAST(123 AS DECIMAL(3,2)) | +---------------------------+ | 9.99 | +---------------------------+ 1 row in set将字符串文本 "123" 转换为 JSON 类型。
obclient> SELECT CAST("123" AS JSON); +---------------------+ | CAST("123" AS JSON) | +---------------------+ | 123 | +---------------------+ 1 row in set将 "1-2"的结果分别使用无符号表示和有符号表示。
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()进行数值运算。obclient> SELECT CAST(1 AS UNSIGNED) - 2.0; +---------------------------+ | CAST(1 AS UNSIGNED) - 2.0 | +---------------------------+ | -1.0 | +---------------------------+ 1 row in set将数值 123 转换为
CHAR类型。obclient> SELECT CAST(123 AS CHAR(2)); +----------------------+ | CAST(123 AS CHAR(2)) | +----------------------+ | 12 | +----------------------+ 1 row in set将数值 1 转换为
CHAR类型并指定字符集。obclient> SELECT CAST(1 AS CHAR CHARACTER SET utf8mb4); +---------------------------------------+ | CAST(1 AS CHAR CHARACTER SET utf8mb4) | +---------------------------------------+ | 1 | +---------------------------------------+ 1 row in set将字符型
123转化为整型、整数1转化为INT类型。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类型构成,语句如下: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>>数据,语句如下: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类型。obclient> SELECT CAST(123.456 AS BIGINT);返回结果如下:
+-------------------------+ | CAST(123.456 AS BIGINT) | +-------------------------+ | 123 | +-------------------------+ 1 row in set