类型转换函数
CAST
CAST(expr AS type)
描述:将表达式expr显式转换为数据类型type,等价于CONVERT(expr, type)。type支持如下数据类型:
- BINARY[ (N) ]
当expr为NULL时,返回值类型为BINARY(0);expr不为NULL时,返回值类型为VARBINARY。如果指定了可选长度N,超出N的部分会被截断,不足N的部分使用0x00进行填充。如果未指定可选长度N,将根据表达式的结果确定返回值的长度。如果返回值的长度超出BINARY的上限,则返回值类型为BLOB,仍不足则返回值类型为LONGBLOB。N的取值受GUC参数max_allowed_packet的影响,最大取值为Min(max_allowed_packet, 1073741819)。
- CHAR[ (N) ]
当expr为NULL时,返回值类型为CHAR(0);expr不为NULL时,返回值类型为VARCHAR。如果指定了可选长度N,超出N的部分会被截断,不足N的部分不会进行填充。如果未指定可选长度N,将根据表达式的结果确定返回值的长度。如果返回值的长度超出VARCHAR的上限,则返回值类型为TEXT,仍不足则返回值类型为LONGTEXT。
- DATE
- DATETIME[ (M) ]
- TIME[ (N) ]
- DECIMAL[ M [ , D ] ) ]
返回值类型为DECIMAL,M用于确定最大位数(精度),最大值为65,默认为10。D用于确定小数点后的位数,最大值为30,默认为0。
- DOUBLE
- FLOAT[ (p) ]
当没有指定精度p时,返回值类型为FLOAT。当p >=0且p < 24时,返回值类型为FLOAT。当p >= 24时,返回值类型为DOUBLE。 当p < 0时,返回错误。
- JSON
- SIGNED[ INTEGER ]
- UNSIGNED[ INTEGER ]
示例:
m_db=# SELECT CAST('abc' AS BINARY(2));
WARNING: Truncated incorrect binary(2) value: 'abc'
CONTEXT: referenced column: cast
cast
------
ab
(1 row)
m_db=# SELECT CAST('abc' AS CHAR(10));
cast
------
abc
(1 row)
m_db=# SELECT CAST('2023/1/1' AS DATE);
cast
------------
2023-01-01
(1 row)
m_db=# SELECT CAST('2023/01/01' AS DATETIME(2));
cast
------------------------
2023-01-01 00:00:00.00
(1 row)
m_db=# SELECT CAST('09:23:14' AS TIME(2));
cast
-------------
09:23:14.00
(1 row)
m_db=# SELECT CAST(12.34567 AS DECIMAL(10,4));
cast
---------
12.3457
(1 row)
m_db=# SELECT CAST(-12 AS SIGNED);
cast
------
-12
(1 row)
m_db=# SELECT CAST(-12 AS UNSIGNED);
cast
----------------------
18446744073709551604
(1 row)
CONVERT
- CONVERT(expr, type)
描述:将表达式expr显式转换为数据类型type,等价于CAST(expr, type)。
示例:
m_db=# SELECT CONVERT('abc', BINARY(2)); WARNING: Truncated incorrect binary(2) value: 'abc' CONTEXT: referenced column: convert convert --------- ab (1 row) m_db=# SELECT CONVERT('abc', CHAR(10)); convert --------- abc (1 row) m_db=# SELECT CONVERT('2023/1/1', DATE); convert ------------ 2023-01-01 (1 row) m_db=# SELECT CONVERT('2023/01/01', DATETIME(2)); convert ------------------------ 2023-01-01 00:00:00.00 (1 row) m_db=# SELECT CONVERT('09:23:14', TIME(2)); convert ------------- 09:23:14.00 (1 row) m_db=# SELECT CONVERT(12.34567, DECIMAL(10,4)); convert --------- 12.3457 (1 row) m_db=# SELECT CONVERT(-12, SIGNED); convert --------- -12 (1 row) m_db=# SELECT CONVERT(-12, UNSIGNED); convert ---------------------- 18446744073709551604 (1 row)