更新时间:2024-05-14 GMT+08:00
数值数据类型
表1 整数类型
序号 |
MySQL数据库 |
GaussDB数据库 |
差异 |
1 |
BOOL |
不完全兼容 |
MySQL:BOOL/BOOLEAN类型实际映射为TINYINT类型。 GaussDB:支持BOOL,其中:
- “真”值的有效文本值是:TRUE、't'、'true'、'y'、'yes'、'1' 、'TRUE'、true、'on'以及所有非0数值。
- “假”值的有效文本值是:FALSE、'f'、'false'、'n'、'no'、'0'、0、'FALSE'、false、'off'。
使用TRUE和FALSE是比较规范的用法(也是SQL兼容的用法)。 |
2 |
BOOLEAN |
不完全兼容 |
3 |
TINYINT[(M)] [UNSIGNED] |
支持 |
详细请参见说明。 |
4 |
SMALLINT[(M)] [UNSIGNED] |
支持 |
详细请参见说明。 |
5 |
MEDIUMINT[(M)] [UNSIGNED] |
支持 |
MySQL存储MEDIUMINT数据需要3字节。
- 带符号的范围是-8,388,608 ~ +8,388,607。
- 无符号的范围是0 ~ +16,777,215。
GaussDB映射为INT类型,存储需要4字节。
- 带符号的范围是-2,147,483,648 ~ +2,147,483,647。
- 无符号的范围是0 ~ +4,294,967,295。
其他差异请参见说明。 |
6 |
INT[(M)] [UNSIGNED] |
支持 |
详细请参见说明。 |
7 |
INTEGER[(M)] [UNSIGNED] |
支持 |
详细请参见说明。 |
8 |
BIGINT[(M)] [UNSIGNED] |
支持 |
详细请参见说明。 |
表2 任意精度类型
序号 |
MySQL数据库 |
GaussDB数据库 |
差异 |
1 |
DECIMAL[(M[,D])] |
支持 |
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输入格式:当字符串入参全部被截断时不会报错,如‘@123’;只有被部分截断时才会报错,如‘12@3’。
|
2 |
NUMERIC[(M[,D])] |
支持 |
3 |
DEC[(M[,D])] |
支持 |
4 |
FIXED[(M[,D])] |
不支持 |
- |
表3 浮点类型
序号 |
MySQL数据库 |
GaussDB数据库 |
差异 |
1 |
FLOAT[(M,D)] |
支持 |
- 分区表支持:FLOAT数据类型不支持KEY键值分区策略分区表。
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
2 |
FLOAT(p) |
支持 |
- 分区表支持:FLOAT数据类型不支持KEY键值分区策略分区表。
- 操作符:数值类型使用^操作符,与MySQL不一致,GaussDB中^操作符为取指数运算。
- 取值范围:定义精度p时,仅支持使用合法的整型数据类型。
- 输出格式:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
3 |
DOUBLE[(M,D)] |
支持 |
- 分区表支持:DOUBLE数据类型不支持KEY键值分区策略分区表。
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
4 |
DOUBLE PRECISION[(M,D)] |
支持 |
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
5 |
REAL[(M,D)] |
支持 |
- 分区表支持:REAL数据类型不支持KEY值分区策略分区表。
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
表4 序列整数
序号 |
MySQL数据库 |
GaussDB数据库 |
差异 |
1 |
SERIAL |
不完全兼容 |
SERIAL介绍详见GaussDB 开发者指南 数值类型章节。
规格上与MySQL的差异如下:
CREATE TABLE test(f1 serial, f2 CHAR(20));
- 类型定义的差异,MySQL的serial是映射到BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,GaussDB的serial是映射到INTEGER NOT NULL DEFAULT nextval('test_f1_seq'::regclass)。如:
-- MySQL serial的定义:
mysql> SHOW CREATE TABLE test\G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`f1` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`f2` char(20) DEFAULT NULL,
UNIQUE KEY `f1` (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
-- GaussDB serial的定义
gaussdb=# \d+ test
Table "public.test"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------------+---------------------------------------------------+----------+--------------+-------------
f1 | integer | not null default nextval('test_f1_seq'::regclass) | plain | |
f2 | character(20) | | extended | |
Has OIDs: no
Options: orientation=row, compression=no, storage_type=USTORE
- INSERT场景下serial类型DEFAULT值的差异。如:
-- MySQL插入serial的DEFAULT值
mysql> INSERT INTO test VALUES(DEFAULT, 'aaaa');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO test VALUES(10, 'aaaa');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO test VALUES(DEFAULT, 'aaaa');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM test;
+----+------+
| f1 | f2 |
+----+------+
| 1 | aaaa |
| 10 | aaaa |
| 11 | aaaa |
+----+------+
3 rows in set (0.00 sec)
-- GaussDB插入serial的DEFAULT值
gaussdb=# INSERT INTO test VALUES(DEFAULT, 'aaaa');
INSERT 0 1
gaussdb=# INSERT INTO test VALUES(10, 'aaaa');
INSERT 0 1
gaussdb=# INSERT INTO test VALUES(DEFAULT, 'aaaa');
INSERT 0 1
gaussdb=# SELECT * FROM test;
f1 | f2
----+----------------------
1 | aaaa
2 | aaaa
10 | aaaa
(3 rows)
- REPLACE场景下serial类型引用列的差异,GaussDB引用列的介绍详见GaussDB 开发者指南 REPLACE语法章节。如:
-- MySQL插入serial引用列的值
mysql> REPLACE INTO test VALUES(f1, 'aaaa');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO test VALUES(f1, 'bbbb');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM test;
+----+------+
| f1 | f2 |
+----+------+
| 1 | aaaa |
| 2 | bbbb |
+----+------+
2 rows in set (0.00 sec)
-- GaussDB插入serial引用列的值
gaussdb=# REPLACE INTO test VALUES(f1, 'aaaa');
REPLACE 0 1
gaussdb=# REPLACE INTO test VALUES(f1, 'bbbb');
REPLACE 0 1
gaussdb=# SELECT * FROM test;
f1 | f2
----+----------------------
0 | aaaa
0 | bbbb
(2 rows)
|