1 |
DATE |
支持 |
GaussDB支持date数据类型,与MySQL相比规格上存在如下差异:
- 输入格式
- GaussDB只支持字符类型,不支持数值类型。如支持'2020-01-01'或'20200101'字符串格式,不支持20200101数值输入。MySQL支持数值输入转换为date类型。
- 分隔符:GaussDB不支持加号“+”、冒号“:”作为年、月、日之间的分隔符,其他的符号都支持。MySQL所有符号均可作为分隔符。 分隔符混合使用的某些场景也不支持,与MySQL也有差异,如'2020-01>01','2020/01+01'等,不建议混合使用分隔符,建议使用最常用的“-”、“/”作为分隔符。
- 无分隔符:推荐使用完整格式,如 'YYYYMMDD' 或者 'YYMMDD'。其他不完整的格式(包括超长格式)解析的规则与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
- 输出格式
GaussDB在sql_mode参数不包含'strict_trans_tables'选项(定义为宽松模式,否则为严格模式)时,允许年、月、日的值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如date '0000-00-10' 转换为:0002-12-10 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00值。MySQL对于包含0值年、月、日的date值会原样输出。
- 取值范围
GaussDB的范围是4713-01-01 BC ~ 5874897-12-31 AD,支持公元前的日期,宽松模式下超过范围时,返回的是0值:0000-00-00,严格模式下会报错。MySQL的范围是 0000-00-00 ~ 9999-12-31,宽松模式下超过范围后,各个场景下的表现并不一致,可能报错(如select查询语句中),也可能返回0000-00-00值(如insert时)。此差异会导致date类型作为函数入参时,函数返回的结果存在差异。
- 操作符
- GaussDB仅支持date类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;date与interval类型的加法运算,返回结果为date类型;date与interval类型的减法运算,返回结果为date类型;date类型之间的减法运算,返回结果为interval类型。
- MySQL date类型和其他数值类型运算时,会先将date转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-- MySQL: date + 数值,先将date类型转换为数值20200101,再与1相加,结果为数值类型20200102
mysql> select date'2020-01-01' + 1;
+----------------------+
| date'2020-01-01' + 1 |
+----------------------+
| 20200102 |
+----------------------+
1 row in set (0.00 sec)
-- GaussDB: date + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的日期。
gaussdb=# select date'2020-01-01' + 1;
?column?
------------
2020-01-02
(1 row)
|
- 类型转换
相比较MySQL,GaussDB仅支持date类型与char(n)、nchar(n)、datetime、timestamp类型之间的相互转换,不支持与binary、decimal、json、integer、unsigned integer、time 类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。
|
2 |
DATETIME[(fsp)] |
支持 |
GaussDB支持datetime数据类型,与MySQL相比规格上存在如下差异:
- 输入格式
- GaussDB只支持字符类型,不支持数值类型。如支持'2020-01-01 10:20:30.123456'或'20200101102030.123456'字符串格式,不支持如20200101102030.123456的数值类型输入。MySQL支持数值输入转换为datetime类型。
- 分隔符:GaussDB不支持加号“+”、冒号“:”作为年、月、日之间的分隔符,其他的符号都支持。仅支持冒号“:”作为时、分、秒之间的分隔符,其他的符号都不支持。分隔符混合使用的某些场景也不支持,与MySQL也有差异,不推荐使用。MySQL支持所有符号作为分隔符。
- 无分隔符:GaussDB推荐使用完整格式'YYYYMMDDhhmiss.ffffff'。其他不完整的格式(包括超长格式)解析的规则可能与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
- 输出格式:
- 统一为'YYYY-MM-DD hh:mi:ss.ffffff'的格式,格式与MySQL无差异,且不受DateStyle参数的影响。但是对于精度部分,如果最后几位为0,GaussDB不显示,MySQL会显示。
- GaussDB在sql_mode参数不包含'strict_trans_tables'选项(定义为宽松模式,否则为严格模式)时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如datetime '0000-00-10 00:00:00' 转换为:0002-12-10 00:00:00 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。MySQL对于包含0值年、月、日的datetime值会原样输出。
- 取值范围
4713-11-24 00:00:00.000000 BC ~ 294277-01-09 04:00:54.775806 AD。294277-01-09 04:00:54.775807 AD 返回的是infinity。对于超过范围的值,严格模式下GaussDB会报错,MySQL是否报错取决于使用场景。一般查询场景不报错,而执行DML SQL语句更改表属性的值时报错。宽松模式下GaussDB返回0000-00-00 00:00:00值,MySQL根据使用场景可能报错,也可能返回0000-00-00 00:00:00值或者null值。这个差异会导致以datetime类型为入参的函数执行结果与MySQL也存在差异。
- 精度
范围0~6,作为表列的类型时缺省为0,与MySQL一致。对于 datetime[(p)] 'str' 表达式场景,GaussDB将(p)作为精度解析,缺省为6,将'str'按照p指定的精度格式化成datetime类型。MySQL不支持datetime[(p)] 'str'表达式。
- 操作符
- GaussDB仅支持datetime类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;datetime与interval类型的加法运算,返回结果为datetime类型;datetime与interval 类型的减法运算,返回结果为datetime类型;datetime类型之间的减法运算,返回结果为interval类型。
- MySQL datetime类型和其他数值类型运算时,会先将datetime转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-- MySQL: datetime + 数值,先将datetime类型转换为数值20201010123456,再与1相加,结果为数值类型20201010123457
mysql> select cast('2020-10-10 12:34:56.123456' as datetime) + 1;
+----------------------------------------------------+
| cast('2020-10-10 12:34:56.123456' as datetime) + 1 |
+----------------------------------------------------+
| 20201010123457 |
+----------------------------------------------------+
1 row in set (0.00 sec)
-- GaussDB: datetime + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的datetime。
gaussdb=# select cast('2020-10-10 12:34:56.123456' as datetime) + 1;
?column?
---------------------
2020-10-11 12:34:56
(1 row)
|
将datetime类型与数值的运算结果作为函数的入参,可能导致函数的结果与MySQL也存在差异。
- 类型转换
相比较MySQL,GaussDB仅支持datetime类型与char(n)、varchar(n)、timestamp类型之间的相互转换、datetime到date、time类型的转换(仅赋值和显式转换)。不支持与binary、decimal、json、integer、unsigned integer类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。
- 时区
GaussDB支持datetime值中携带时区信息(时区偏移或者时区名),如'2020-01-01 12:34:56.123456 +01:00' 或者 '2020-01-01 2:34:56.123456 CST'。GaussDB会将其转换为当前服务器时区的时间。MySQL不支持(5.7版本不支持,8.0及之后的版本支持)。
- GaussDB的datetime数据类型的表字段实际上会被转换为timestamp(p) without time zone类型,查询表信息或者使用工具导出的表结构,其字段的数据类型显示的是timestamp(p) without time zone,而不是datetime。MySQL显示的是datetime(p)。
|
3 |
TIMESTAMP[(fsp)] |
支持 |
GaussDB支持timestamp数据类型,与MySQL相比规格上存在如下差异:
- 输入格式:
- 只支持字符类型,不支持数值类型。如支持'2020-01-01 10:20:30.123456'或'20200101102030.123456'字符串格式,不支持如20200101102030.123456的数值类型输入。MySQL支持数值输入转换为timestamp类型。
- 分隔符:不支持加号“+”、冒号“:”作为年、月、日之间的分隔符,其他的符号都支持。仅支持冒号“:”作为时、分、秒之间的分隔符,其他的符号都不支持。分隔符混合使用的某些场景也不支持,与MySQL也有差异,不推荐使用。MySQL支持所有符号作为分隔符。
- 无分隔符:推荐使用完整格式'YYYYMMDDhhmiss.ffffff'。其他不完整的格式(包括超长格式)解析的规则可能与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
- 输出格式:
- 统一为'YYYY-MM-DD hh:mi:ss.ffffff'的格式,格式与MySQL无差异,且不受DateStyle参数的影响。但是对于精度部分,如果最后几位为0,GaussDB不显示,MySQL会显示。
- GaussDB在sql_mode参数不包含'strict_trans_tables'选项(定义为宽松模式,否则为严格模式)时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如timestamp '0000-00-10 00:00:00' 转换为:0002-12-10 00:00:00 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。MySQL对于包含0值年、月、日的timestamp值会原样输出。
- 取值范围:
4713-11-24 00:00:00.000000 BC ~ 294277-01-09 04:00:54.775806 AD。294277-01-09 04:00:54.775807 AD 返回的是infinity。对于超过范围的值,严格模式下GaussDB会报错,MySQL是否报错取决于使用场景。一般查询场景不报错,而执行DML SQL语句更改表属性的值时报错。宽松模式下GaussDB返回0000-00-00 00:00:00值,MySQL根据使用场景可能报错,也可能返回0000-00-00 00:00:00值或者null值。这个差异会导致以timestamp类型为入参的函数执行结果与MySQL也存在差异。
- 精度:
范围0~6,作为表列的类型时缺省为0,与MySQL一致。对于 timestamp[(p)] 'str' 表达式场景:
- GaussDB将(p)作为精度解析,缺省为6,将'str'按照p指定的精度格式化成timestamp类型。
- MySQL将timestamp 'str'的含义与GaussDB一致,缺省精度也为6。但是将timestamp(p) 'str'解析为函数调用,p作为timestamp函数的入参,结果返回一个timestamp类型的值,'str'作为投影列的别名。
- 操作符:
- GaussDB仅支持timestamp类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;timestamp与interval类型的加法运算,返回结果为timestamp类型;timestamp与interval类型的减法运算,返回结果为timestamp类型;timestamp类型之间的减法运算,返回结果为interval类型。
- MySQL timestamp类型和其他数值类型运算时,会先将timestamp转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-- MySQL: timestamp + 数值,先将timestamp类型转换为数值20201010123456.123456,再与1相加,结果为数值类型20201010123457.123456
mysql> select timestamp '2020-10-10 12:34:56.123456' + 1;
+--------------------------------------------+
| timestamp '2020-10-10 12:34:56.123456' + 1 |
+--------------------------------------------+
| 20201010123457.123456 |
+--------------------------------------------+
1 row in set (0.00 sec)
-- GaussDB: timestamp + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的timestamp。
gaussdb=# select timestamp '2020-10-10 12:34:56.123456' + 1;
?column?
----------------------------
2020-10-11 12:34:56.123456
(1 row)
|
将timestamp类型与数值的运算结果作为函数的入参,可能导致函数的结果与MySQL也存在差异。
- 类型转换:
相比较MySQL,GaussDB仅支持timestamp类型与char(n)、varchar(n)、datetime类型之间的相互转换、timestamp到date、time类型的转换(仅赋值和显式转换)。不支持与binary、decimal、json、integer、unsigned integer类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。
- 时区:
GaussDB支持timestamp值中携带时区信息(时区偏移或者时区名),如'2020-01-01 12:34:56.123456 +01:00' 或者 '2020-01-01 2:34:56.123456 CST'。GaussDB会将其转换为当前服务器时区的时间。如果更改服务器时区,timestamp类型的值输出时会转换为更改后时区的时间戳。MySQL不支持(5.7版本不支持,8.0及之后的版本支持)。
- GaussDB的timestamp数据类型的表字段实际上会被转换为timestamp(p) with time zone类型,查询表信息或者使用工具导出的表结构,其字段的数据类型显示的是timestamp(p) with time zone,而不是timestamp。MySQL显示的是timestamp(p)。
|
4 |
TIME[(fsp)] |
支持 |
GaussDB支持time数据类型,与MySQL相比规格上存在如下差异:
- 输入格式:
- 只支持字符类型,不支持数值类型。如支持'1 10:20:30'或'102030'字符串格式,不支持102030数值输入。MySQL支持数值输入转换为time类型。
- 分隔符:GaussDB仅支持冒号“:”作为时、分、秒之间的分隔符,其他的符号都不支持。MySQL支持所有的符号作为分隔符。
- 无分隔符:推荐使用完整格式,如 'hhmiss.ffffff'。其他不完整的格式(包括超长格式)解析的规则可能与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
- 分、秒、精度输入负数时,GaussDB数据库可能会忽略第一个负数开始的部分,涉及的部分解析为0,如:'00:00:-10' 解析结果为 '00:00:00'。 也可能报错,如:'00:00:-10000' 会解析报错。取决于输入值的范围。而MySQL数据库统一报错。
- 输出格式:
统一为hh:mi:ss.ffffff的格式,格式与MySQL无差异。但是对于精度部分,如果最后几位为0,GaussDB不显示,MySQL会显示。
- 取值范围:
-838:59:59.000000 ~ 838:59:59.000000,与MySQL一致。对于超过范围的值,宽松模式下GaussDB无论是查询还是insert/update等DML操作,返回的值都是就近的边界值:-838:59:59或838:59:59。MySQL是查询时报错,DML操作返回的值才是就近边界值,场景上存在差异。此差异会导致time类型作为函数入参时,函数返回的结果也存在差异。
- 精度:
范围0~6,作为表列的类型时缺省为0,与MySQL一致。对于 time(p) 'str' 表达式场景,GaussDB将(p)作为精度解析,缺省为6,将'str'按照p指定的精度格式化成time类型。MySQL是解析为time函数,p是入参,'str'是投影列的别名。
- 操作符:
- GaussDB仅支持time类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;time与interval类型的加法运算,返回结果为time类型;time与interval类型的减法运算,返回结果为time类型;time类型之间的减法运算,返回结果为interval类型。
- MySQL time类型和其他数值类型运算时,会先将time转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-- MySQL: time + 数值,先将time类型转换为数值123456,再与1相加,结果为数值类型123457
mysql> select time '12:34:56' + 1;
+---------------------+
| time '12:34:56' + 1 |
+---------------------+
| 123457 |
+---------------------+
1 row in set (0.00 sec)
-- GaussDB: time + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的time,由于是加了24小时,得到的仍然是12:34:56。
gaussdb=# select time '12:34:56' + 1;
?column?
----------
12:34:56
(1 row)
|
将time类型与数值的运算结果作为函数的入参,可能导致函数的结果与MySQL也存在差异。
- 类型转换:
相比较MySQL,GaussDB仅支持time类型与char(n)、nchar(n)类型之间的相互转换、datetime、timestamp到time类型的转换。不支持与binary、decimal、date、json、integer、unsigned integer类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。
|
5 |
YEAR[(4)] |
支持 |
GaussDB支持year数据类型,与MySQL相比规格上存在如下差异:
|
6 |
INTERVAL |
支持 |
GaussDB支持INTERVAL数据类型,但INTERVAL在MySQL中为表达式,同时存在以下差异:
- 不支持字符串类型的日期输入作为运算,如:select '2023-01-01' + interval 1 day。
- 不支持interval expr unit语法中,expr为负整数或浮点数的输入,如:select date'2023-01-01' + interval -1 day。
- 不支持interval expr unit语法中,expr为运算表达式的输入,如:select date'2023-01-01' + interval 4/2 day。
- interval表达式参与运算时,返回值固定为datetime类型,MySQL为datetime或date类型。运算的逻辑与原有GaussDB保持一致,与MySQL有差异。
- interval expr unit语法中,expr数值支持的范围会根据unit单位的不同有所差异,最大可支持的范围为[-2147483648, 2147483647]。超过范围时,严格模式报error,宽松模式报warning并返回0值。
- interval expr unit语法中,expr指定的字段数量大于unit预期的字段数量时,在严格模式,报error;在宽松模式,报warning并返回0值。如unit取值为DAY_HOUR,预期的字段数量为2,expr取值为'1-2-3',字段数量为3。
|