
# 类型转换函数
 #### 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 返回值类型为DATE。
  
- DATETIME\[ (M) \] 返回值类型为DATETIME，M用于确定秒的精度，范围为\[0,6\]。
  
- TIME\[ (N) \] 返回值类型为TIME，M用于确定秒的精度，范围为\[0,6\]。
  
- DECIMAL\[ M \[ , D \] ) \] 返回值类型为DECIMAL，M用于确定最大位数（精度），最大值为65，默认为10。D用于确定小数点后的位数，最大值为30，默认为0。
  
- DOUBLE 返回值类型为DOUBLE。
  
- FLOAT\[ (p) \] 当没有指定精度p时，返回值类型为FLOAT。当p \>= 0且 p \< 24时，返回值类型为FLOAT。当p \>= 24时，返回值类型为DOUBLE。 当p \< 0时，返回错误。
  
- SIGNED\[ INTEGER \] 返回值类型为带符号的BIGINT。
  
- UNSIGNED\[ INTEGER \] 返回值类型为不带符号的BIGINT。
  
示例：
```
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)
  ```
  

- CONVERT(expr USING transcoding_name) 描述：将表达式expr转换为transcoding_name指定的字符集。
  示例：
  ```
  m_db=# SELECT CONVERT('abc' USING 'latin1');
   convert 
  ---------
   abc
  (1 row)
  ```
  
 
