3.3.2.5. 转换为 Gaussdb-Mysql

3.3.2.5.1. 其他函数

3.3.2.5.1.1. CAST

语法
CAST (expr AS type)
描述
expr 转换为指定的数据类型。

参数

参数

说明

expr

要转换类型的值。

type

转换的目标类型。

注意

  • 数据类型转换仅支持相同类型或可以隐式转换的类型。此外,MySQL 与 GaussDB-Mysql 在数据类型处理上有一些差异。

    例如,对于将字符串类型转换为数值类型, CAST(‘-123.45’ AS DECIMAL(10,2)) 在 MySQL 中的结果为 -123.45,而在 GaussDB-Mysql 中结果为 0.00。 此外,GaussDB-Mysql 会产生警告: WARNING: Truncated incorrect DECIMAL value: ‘-123.45’

    有关详细差异,请参阅文档中的相关章节:3.1.6 数据类型转换、3.2.5 强制转换函数等。 GaussDB-Mysql与MySQL兼容性差异

  • 在 MySQL 中,NULL 和空字符串是不同的;而在 GaussDB-Mysql 中,这两者被视为相等,结果均为 NULL

示例

-- 转换前MySQL SQL:

SELECT cast(1.5 as SIGNED) as col_signed;
+------------+
| col_signed |
+------------+
|          2 |
+------------+

SELECT cast(1.5 as UNSIGNED) as col_unsigned;
+--------------+
| col_unsigned |
+--------------+
|            2 |
+--------------+

SELECT cast('1.5' as SIGNED) as col_signed;
+------------+
| col_signed |
+------------+
|          1 |
+------------+

SELECT cast('1.5' as UNSIGNED) as col_unsigned;
+--------------+
| col_unsigned |
+--------------+
|            1 |
+--------------+

SELECT cast(1234 as DECIMAL) as  col_decimal;
+-------------+
| col_decimal |
+-------------+
|        1234 |
+-------------+

SELECT cast(STR_TO_DATE('2024-01-31 14:30:00', '%Y-%m-%d %H:%i:%s') as DATE) as col_date;
+------------+
| col_date   |
+------------+
| 2024-01-31 |
+------------+

SELECT cast(STR_TO_DATE('2024-01-31 14:30:00', '%Y-%m-%d %H:%i:%s') as DATETIME) as col_datetime;
+---------------------+
| col_datetime        |
+---------------------+
| 2024-01-31 14:30:00 |
+---------------------+



-- 转换后Gaussdb-Mysql SQL:

SELECT cast(1.5 as SIGNED) as col_signed;
col_signed
------------
         2

SELECT cast(1.5 as UNSIGNED) as col_unsigned;
col_unsigned
--------------
2

SELECT cast('1.5' as SIGNED) as col_signed;
WARNING:  Truncated incorrect INTEGER value: '1.5'
CONTEXT:  referenced column: col_signed
col_signed
------------
         1

SELECT cast('1.5' as UNSIGNED) as col_unsigned;
WARNING:  Truncated incorrect INTEGER value: '1.5'
CONTEXT:  referenced column: col_unsigned
col_unsigned
--------------
1

SELECT cast(1234 as DECIMAL) as  col_decimal;
col_decimal
-------------
      1234

SELECT cast(STR_TO_DATE('2024-01-31 14:30:00', '%Y-%m-%d %H:%i:%s') as DATE) as col_date;
col_date
------------
2024-01-31

SELECT cast(STR_TO_DATE('2024-01-31 14:30:00', '%Y-%m-%d %H:%i:%s') as DATETIME) as col_datetime;
   col_datetime
---------------------
2024-01-31 14:30:00

3.3.2.5.1.2. CONVERT(expr,type)

语法
CONVERT(expr,type)
描述
expr 转换为指定的数据类型 type

方法参数和返回值

属性

描述

参数 1 (expr)

要转换的表达式,可以是列名、常量或函数调用。

参数 2 (type)

目标数据类型,范围包括:SIGNED, UNSIGNED, DECIMAL(M,D), CHAR, TIME, DATETIME

返回值

将参数 1 (expr)转换为参数 2 (type) 指定的数据类型的值。

注意

  • 数据类型转换仅支持相同类型或可以隐式转换的类型。此外,MySQL 与 GaussDB-Mysql 在数据类型处理上有一些差异。

    例如,对于将字符串类型转换为数值类型, convert(‘-123.45’ , DECIMAL(10,2)) 在 MySQL 中的结果为 -123.45,而在 GaussDB-Mysql 中结果为 0.00。 此外,GaussDB-Mysql 会产生警告: WARNING: Truncated incorrect DECIMAL value: ‘-123.45’

    有关详细差异,请参阅文档中的相关章节:3.1.6 数据类型转换、3.2.5 强制转换函数等。 GaussDB-Mysql与MySQL兼容性差异

  • 在 MySQL 中,NULL 和空字符串是不同的;而在 GaussDB-Mysql 中,这两者被视为相等,结果均为 NULL

  • 目标数据类型 CHAR(N) 会限制转换结果的字符数,不超过指定的字符数 N。比如SELECT CONVERT(123.4567 , char(5)); 在源库maridb和目标库gaussdb mysql 505.2都转成123.4

  • 目标数据类型 binary ,统一sql解析报错。

  • 字符串转到时间time,如果字符串本身就不是时间格式,比如’Hello World’,在源库maridb转成空,在目标库gaussdb mysql 505.2版本转成00:00:00。

  • 字符串转到日期时间datetime,如果字符串本身就不是时间格式,比如’Hello World’,在源库maridb和目标库gaussdb mysql 505.2都转成空。

  • 字符串转到有符号整数(SIGNED),SELECT CONVERT(‘abc’, SIGNED) AS invalid_signed ,在源库maridb和目标库gaussdb mysql 505.2都转成0。

  • 无效的日期时间,比如SELECT CONVERT(‘2023-13-01’, DATETIME) AS invalid_datetime;SELECT CONVERT(‘25:61:61’, TIME) AS invalid_time;在源库maridb和目标库gaussdb mysql 505.2都转成NULL。

  • 无符号整数和有符号数,超过边界就还是边界的值,无符号整数边界值18446744073709551615,有符合整数的边界值-9223372036854775808~9223372036854775807

示例

数据准备
========

创建测试表
--------

CREATE TABLE test_conversions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    int_value INT,
    decimal_value DECIMAL(10,2),
    string_value VARCHAR(100),
    time_value TIME,
    datetime_value DATETIME,
    unsigned_value INT UNSIGNED
);

插入测试数据
----------

INSERT INTO test_conversions (
    int_value, decimal_value, string_value, time_value, datetime_value, unsigned_value
)
VALUES
    (-123, 456.78, '2023-05-15', '14:30:00', '2023-05-15 14:30:00', 123),
    (987, -65.43, 'Hello World', '23:59:59', '2022-12-31 23:59:59', 4294967295),
    (0, 0.00, '123.45', '00:00:00', '2000-01-01 00:00:00', 0);

类型转换测试
=============

转换为 SIGNED(有符号整数)
------------------------

-- 转换前
SELECT string_value, CONVERT(string_value, SIGNED) AS to_signed,
       CONVERT(decimal_value, SIGNED) AS decimal_to_signed
FROM test_conversions
ORDER BY id DESC;

-- 结果:
string_value|to_signed|decimal_to_signed|
------------+---------+-----------------+
123.45      |      123|                0|
Hello World |        0|              -65|
2023-05-15  |     2023|              457|

-- 转换后
SELECT `string_value`, CONVERT(`string_value`, SIGNED) AS `to_signed`,
       CONVERT(`decimal_value`, SIGNED) AS `decimal_to_signed`
FROM `test_conversions`
ORDER BY `id` DESC;

-- 转换后结果
string_value|to_signed|decimal_to_signed|
------------+---------+-----------------+
123.45      |      123|                0|
Hello World |        0|              -65|
2023-05-15  |     2023|              457|


转换为 UNSIGNED(无符号整数)
--------------------------

-- 转换前
SELECT int_value, CONVERT(int_value, UNSIGNED) AS int_to_unsigned,
       CONVERT(string_value, UNSIGNED) AS string_to_unsigned
FROM test_conversions
ORDER BY id DESC;

-- 结果:
int_value|int_to_unsigned     |string_to_unsigned|
---------+--------------------+------------------+
        0|                   0|               123|
      987|                 987|                 0|
     -123|18446744073709551493|              2023|

-- 转换后
SELECT `int_value`, CONVERT(`int_value`, UNSIGNED) AS `int_to_unsigned`,
       CONVERT(`string_value`, UNSIGNED) AS `string_to_unsigned`
FROM `test_conversions`
ORDER BY `id` DESC;

-- 转换后结果
int_value|int_to_unsigned     |string_to_unsigned|
---------+--------------------+------------------+
        0|                   0|               123|
      987|                 987|                 0|
     -123|18446744073709551493|              2023|

转换为 DECIMAL
------------

-- 转换前
SELECT string_value, CONVERT(string_value, DECIMAL(5,2)) AS string_to_decimal,
       CONVERT(int_value, DECIMAL(10,3)) AS int_to_decimal
FROM test_conversions;

-- 结果:
string_value|string_to_decimal|int_to_decimal|
------------+-----------------+--------------+
2023-05-15  |           999.99|      -123.000|
Hello World |             0.00|       987.000|
123.45      |           123.45|         0.000|

-- 转换后
SELECT `string_value`, CONVERT(`string_value`, DECIMAL(5, 2)) AS `string_to_decimal`,
       CONVERT(`int_value`, DECIMAL(10, 3)) AS `int_to_decimal`
FROM `test_conversions`;


-- 转换后结果
string_value|string_to_decimal|int_to_decimal|
------------+-----------------+--------------+
2023-05-15  |           999.99|      -123.000|
Hello World |             0.00|       987.000|
123.45      |           123.45|         0.000|

转换为 CHAR
---------

-- 转换前
SELECT int_value, CONVERT(int_value, CHAR) AS int_to_char,
       CONVERT(datetime_value, CHAR) AS datetime_to_char,
       CONVERT(time_value, CHAR) AS time_to_char
FROM test_conversions;

-- 结果:
int_value|int_to_char|datetime_to_char   |time_to_char|
---------+-----------+-------------------+------------+
     -123|-123       |2023-05-15 14:30:00|14:30:00    |
      987|987        |2022-12-31 23:59:59|23:59:59    |
        0|0          |2000-01-01 00:00:00|00:00:00    |

-- 转换后
SELECT `int_value`, CONVERT(`int_value`, CHAR) AS `int_to_char`,
       CONVERT(`datetime_value`, CHAR) AS `datetime_to_char`,
       CONVERT(`time_value`, CHAR) AS `time_to_char`
FROM `test_conversions`;

-- 转换后结果:
int_value|int_to_char|datetime_to_char   |time_to_char|
---------+-----------+-------------------+------------+
     -123|-123       |2023-05-15 14:30:00|14:30:00    |
      987|987        |2022-12-31 23:59:59|23:59:59    |
        0|0          |2000-01-01 00:00:00|00:00:00    |


转换为 TIME
---------

-- 转换前
SELECT
    string_value,
    time_value,
    CONVERT(string_value, TIME) AS string_to_time,
    CONVERT(datetime_value, TIME) AS datetime_to_time
FROM test_conversions;

-- 结果:
    string_value|time_value|string_to_time|datetime_to_time|
    ------------+----------+--------------+----------------+
    2023-05-15  |  14:30:00|      00:20:23|        14:30:00|
    Hello World |  23:59:59|              |        23:59:59|
    123.45      |  00:00:00|      00:01:23|        00:00:00|

-- 转换后
SELECT `string_value`, `time_value`,
    CONVERT(`string_value`, TIME) AS `string_to_time`,
    CONVERT(`datetime_value`, TIME) AS `datetime_to_time`
FROM `test_conversions`;

-- 转换后结果:
     string_value | time_value | string_to_time | datetime_to_time
    --------------+------------+----------------+------------------
     2023-05-15   | 14:30:00   | 00:20:23       | 14:30:00
     Hello World  | 23:59:59   | 00:00:00       | 23:59:59
     123.45       | 00:00:00   | 00:01:23       | 00:00:00


转换为 DATETIME
-------------

-- 转换前
SELECT
    string_value,
    datetime_value,
    CONVERT(string_value, DATETIME) AS string_to_datetime,
    CONVERT(time_value, DATETIME) AS time_to_datetime
FROM test_conversions;

-- 结果:
    string_value|datetime_value     |string_to_datetime |time_to_datetime   |
    ------------+-------------------+-------------------+-------------------+
    2023-05-15  |2023-05-15 14:30:00|2023-05-15 00:00:00|2025-05-26 14:30:00|
    Hello World |2022-12-31 23:59:59|                   |2025-05-26 23:59:59|
    123.45      |2000-01-01 00:00:00|                   |2025-05-26 00:00:00|

-- 转换后
SELECT `string_value`, `datetime_value`,
    CONVERT(`string_value`, DATETIME) AS `string_to_datetime`,
    CONVERT(`time_value`, DATETIME) AS `time_to_datetime`
FROM `test_conversions`;

-- 转换后结果:
     string_value |   datetime_value    | string_to_datetime  |  time_to_datetime
    --------------+---------------------+---------------------+---------------------
     2023-05-15   | 2023-05-15 14:30:00 | 2023-05-15 00:00:00 | 2025-05-26 14:30:00
     Hello World  | 2022-12-31 23:59:59 |                     | 2025-05-26 23:59:59
     123.45       | 2000-01-01 00:00:00 |                     | 2025-05-26 00:00:00


组合转换:从字符串到DATETIME再到DATE
--------------------------------

-- 转换前
SELECT
    string_value,
    CONVERT(
        CONVERT(string_value, DATETIME),
        DATE
    ) AS string_to_date
FROM test_conversions
WHERE CONVERT(string_value, DATETIME) IS NOT NULL;

-- 结果:
string_value|string_to_date|
------------+--------------+
2023-05-15  |2023-05-15    |

-- 转换后
SELECT `string_value`,
    CONVERT(
        CONVERT(`string_value`, DATETIME),
        DATE
    ) AS `string_to_date`
FROM `test_conversions`
WHERE CONVERT(`string_value`, DATETIME) IS NOT NULL;

-- 转换后结果:
string_value|string_to_date|
------------+--------------+
2023-05-15  |2023-05-15    |


组合使用,字段显式类型转换(SELECT 子句), 嵌套类型转换(表达式计算),WHERE条件过滤
===============================================================================================

-- 转换前
SELECT
    id,
    string_value,
    CONVERT(string_value, DECIMAL(5,2)) AS price,
    CONVERT(CONVERT(string_value, DECIMAL(5,2)) * 1.1, DECIMAL(5,2)) AS price_with_tax
FROM test_conversions
WHERE CONVERT(string_value, DECIMAL(5,2)) > 0;

-- 结果:
id|string_value|price |price_with_tax|
--+------------+------+--------------+
 1|2023-05-15  |999.99|        999.99|
 3|123.45      |123.45|        135.80|

-- 转换后
SELECT `id`,`string_value`,
    CONVERT(`string_value`, DECIMAL(5, 2)) AS `price`,
    CONVERT(CONVERT(`string_value`, DECIMAL(5, 2))*1.1, DECIMAL(5, 2)) AS `price_with_tax`
FROM `test_conversions`
WHERE CONVERT(`string_value`, DECIMAL(5, 2))>0

-- 转换后结果:
id|string_value|price |price_with_tax|
--+------------+------+--------------+
 1|2023-05-15  |999.99|        999.99|
 3|123.45      |123.45|        135.80|