3.3.2.5. 转换为 Gaussdb-Mysql
3.3.2.5.1. 时间日期函数
3.3.2.5.1.1. TIMESTAMP
- 语法
TIMESTAMP (NOW())
- 描述
- 将 expr 转换为指定的数据类型。
参数
参数 |
说明 |
---|---|
NOW() |
获取当前时间 |
注意
gaussdb_mysql没有timestamp函数,只有timestamp类型的字段。目前只支持timestamp(now())函数语法转换
两个函数返回值类型不同,mariadb返回值类型为:datetime,gaussdb_mysql返回值类型为:timestamptz。
示例
-- 转换前MySQL SQL:
select timestamp(now());
timestamp(now())
-----------------------
2025-06-20 19:15:42.000
-- 转换后Gaussdb-Mysql SQL:
SELECT CAST(now() AS timestamp(0));
now_b
------------
2025-06-20 19:22:39.000
3.3.2.5.2. 其他函数
3.3.2.5.2.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.2.2. CONVERT
- 语法
CONVERT(expr,type)
CONVERT(expr USING code)
- 描述
- 将 expr 转换为指定的数据类型 type。将 expr 按指定编码输出。
方法参数和返回值
CONVERT(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
CONVERT(expr USING code)
属性
描述
参数 1 (expr)
字符串,数值,列表。
参数 2 (code)
目标数据类型,范围包括:GBK。
注意
CONVERT(expr USING code) 主要用于字符集转换,而不是数据类型转换。
code 目前支持’GBK’字符,但是对于’utf8’,’utf8mb4’,’latin1’,’binary’字符也支持解析转换到目标库执行,’utf8mb3’会转换为’utf8’ 。
code 统一SQL转换之后会套上单引号。
其他字符集不支持。
执行结果可能会因数据库差异导致结果不同。
示例
数据准备
========
创建测试表
--------
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|
-- 转换前
select convert('abc' using 'GBK') as a;
-- 结果:
a
--
abc
3.3.2.5.2.3. COMPRESS
- 语法
COMPRESS (expr)
- 描述
- 压缩expr数据。
参数
参数 |
说明 |
---|---|
expr |
字符串和二进制 |
注意
本身不具备压缩功能,主要用于兼容性处理。
入参大小最大支持1GB
示例
-- 转换前MySQL SQL:
select compress('asd') as a
a
-----------
x K,N p 9
-- 转换后 gaussdb-mysql SQL:
select unisql.compress('asd') as a
a
-----------
asd
3.3.2.5.2.4. UNCOMPRESS
- 语法
UNCOMPRESS (expr)
- 描述
- 压缩expr数据。
参数
参数 |
说明 |
---|---|
expr |
字符串和二进制 |
注意
本身不具备解压缩功能,主要用于兼容性处理。
入参为字符串时,如果字符串不是压缩格式,则返回NULL。
入参大小最大支持1GB
示例
-- 转换前MySQL SQL:
select uncompress('asd') as a
a
-----------
null
-- 转换后 gaussdb-mysql SQL:
select unisql.uncompress('asd') as a
a
-----------
null
3.3.2.5.2.5. DATE_ADD
- 语法
DATE_ADD (timestamp1, interval)
- 描述
- 用于将指定的时间间隔添加到日期或时间值上。
参数
参数 |
说明 |
---|---|
timestmap1 |
日期时间,该参数可以为字符串或timestamp/date/datetime数据类型 |
interval |
时间间隔,该参数为interval类型,支持清单:YEAR、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND |
注意
当目标库是gaussdb-mysql B模式并且配置了数据库版本为505.2,并且interval参数的时间值为绑定变量(?)时,统一SQL才会进行转换,否则原样透传
GaussDB MySQL 505.2 版本 B模式 示例
-- 转换前MySQL SQL:
select date_add('20200101', interval 1 day);
select date_add('20200101', interval 1 week);
select date_add('20200101', interval 2.6 day);
select date_add('2011-01-01 11:01:12.123444', INTERVAL 1 DAY) as dateStr from dual;
select date_add('20200101', interval ? day);
select date_add('20200101', interval ? week);
select date_add('2011-01-01 11:01:12.123444', INTERVAL ? DAY) as dateStr from dual;
-- 转换后 gaussdb-mysql SQL:
SELECT date_add('20200101', INTERVAL 1 DAY);
SELECT date_add('20200101', INTERVAL 1 WEEK);
SELECT date_add('20200101', INTERVAL 2.6 DAY);
SELECT date_add('2011-01-01 11:01:12.123444', INTERVAL 1 DAY) AS `dateStr` FROM dual;
SELECT (CAST('20200101' AS timestamp)+CAST(?|| 'DAY' AS INTERVAL));
SELECT (CAST('20200101' AS timestamp)+CAST(?|| 'WEEK' AS INTERVAL));
SELECT (CAST('2011-01-01 11:01:12.123444' AS timestamp)+CAST(?|| 'DAY' AS INTERVAL)) AS `dateStr` FROM dual;
3.3.2.5.2.6. DATE_SUB
- 语法
DATE_SUB (timestamp1, interval)
- 描述
- 用于从指定的日期或时间值中减去一个时间间隔
参数
参数 |
说明 |
---|---|
timestmap1 |
日期时间,该参数可以为字符串或timestamp/date/datetime数据类型 |
interval |
时间间隔,该参数为interval类型,支持清单:YEAR、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND |
注意
当目标库是gaussdb-mysql B模式并且配置了数据库版本为505.2并且interval参数的时间值为绑定变量(?)时,统一SQL才会进行转换,否则原样透传
GaussDB MySQL 505.2 版本 B模式 示例
-- 转换前MySQL SQL:
select date_sub('20200101', interval 1 day);
select date_sub('20200101', interval 1 week);
select date_sub('20200101', interval 2.6 day);
select date_sub('2011-01-01 11:01:12.123444', INTERVAL 1 DAY) as dateStr from dual;
select date_sub('20200101', interval ? day);
select date_sub('20200101', interval ? week);
select date_sub('2011-01-01 11:01:12.123444', INTERVAL ? DAY) as dateStr from dual;
-- 转换后 gaussdb-mysql SQL:
SELECT date_sub('20200101', INTERVAL 1 DAY);
SELECT date_sub('20200101', INTERVAL 1 WEEK);
SELECT date_sub('20200101', INTERVAL 2.6 DAY);
SELECT date_sub('2011-01-01 11:01:12.123444', INTERVAL 1 DAY) AS `dateStr` FROM dual;
SELECT (CAST('20200101' AS timestamp)-CAST(?|| 'DAY' AS INTERVAL));
SELECT (CAST('20200101' AS timestamp)-CAST(?|| 'WEEK' AS INTERVAL));
SELECT (CAST('2011-01-01 11:01:12.123444' AS timestamp)-CAST(?|| 'DAY' AS INTERVAL)) AS `dateStr` FROM dual;