更新时间:2025-06-30 GMT+08:00

数值数据类型

除特别说明外,GaussDB数据库中的数据类型精度、标度、位数大小等默认不支持用浮点型数值定义,建议使用合法的整型数值定义。

表1 整数类型

数据类型

与MySQL的差异

BOOL

输出格式:GaussDB中SELECT TRUE/FALSE输出结果为t/f,MySQL为1/0。

MySQL:BOOL/BOOLEAN类型实际映射为TINYINT类型。

BOOLEAN

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

具体差异请参见表格下方的示例内容。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

具体差异请参见表格下方的示例内容。

INT[(M)] [UNSIGNED] [ZEROFILL]

具体差异请参见表格下方的示例内容。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

差异1:MySQL 5.7在形如'1.2.3.4'这类字符串中含有多个小数点的输入,在宽松模式(sql_mode未包含'strict_trans_tables'选项)下会错误的将第一个小数点的内容也插入进去。MySQL 8.0版本修复了该问题, GaussDB与MySQL 8.0保持一致。

-- GaussDB
m_db=# SET SQL_MODE='';
SET
m_db=# CREATE TABLE test_int(a int);
CREATE TABLE
m_db=# INSERT INTO test_int VALUES('1.2.3');
WARNING:  Data truncated for column
LINE 1: INSERT INTO test_int VALUES('1.2.3');
                                    ^
CONTEXT:  referenced column: a
INSERT 0 1
m_db=# SELECT * FROM test_int;
 a 
---
 1
(1 row)

m_db=# DROP TABLE test_int;
DROP TABLE

-- MySQL 5.7
mysql> SET SQL_MODE='';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE test_int(a int);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test_int VALUES('1.2.3');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> SELECT * FROM test_int;
+------+
| a    |
+------+
|   12 |
+------+
1 row in set (0.00 sec)

mysql> DROP TABLE test_int;
Query OK, 0 rows affected (0.01 sec)

差异2:开启精度开关参数(m_format_behavior_compat_options包含'enable_precision_decimal'选项)时,在UNION的CREATE TABLE AS场景中,GaussDB对于直接输入的整型会取其最大长度(INT为11,BIGINT为20)来计算列的长度,MySQL会根据整型的实际长度来计算列的长度。

-- GaussDB
m_db=# set m_format_behavior_compat_options= 'enable_precision_decimal';
SET
m_db=# CREATE TABLE test_int AS SELECT 1234567 UNION ALL SELECT '456789';
INSERT 0 2
m_db=# DESC test_int;
  Field   |    Type     | Null | Key | Default | Extra 
----------+-------------+------+-----+---------+-------
 ?column? | varchar(11) | YES  |     |         | 
(1 row)

m_db=# DROP TABLE test_int;
DROP TABLE
m_db=# CREATE TABLE test_int AS SELECT 1234567890 UNION ALL SELECT '456789';
INSERT 0 2
m_db=# DESC test_int;
  Field   |    Type     | Null | Key | Default | Extra 
----------+-------------+------+-----+---------+-------
 ?column? | varchar(20) | YES  |     |         | 
(1 row)

m_db=# DROP TABLE test_int;
DROP TABLE

-- MySQL
mysql> CREATE TABLE test_int AS SELECT 1234567 UNION ALL SELECT '456789';
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> DESC test_int;
+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| 1234567 | varchar(7) | NO   |     |         |       |
+---------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> DROP TABLE test_int;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE test_int AS SELECT 1234567890 UNION ALL SELECT '456789';
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> DESC test_int;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| 1234567890 | varchar(10) | NO   |     |         |       |
+------------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> DROP TABLE test_int;
Query OK, 0 rows affected (0.00 sec)
表2 任意精度类型

数据类型

与MySQL的差异

DECIMAL[(M[,D])] [ZEROFILL]

MySQL中该类型用一个9*9的数组存储数值,整数部分和小数部分分开存储,超过该长度时优先截断小数部分。GaussDB只会在整数位数超过81位时发生截断。

NUMERIC[(M[,D])] [ZEROFILL]

DEC[(M[,D])] [ZEROFILL]

FIXED[(M[,D])] [ZEROFILL]

表3 浮点类型

数据类型

与MySQL的差异

FLOAT[(M,D)] [ZEROFILL]

驱动中FLOAT类型和DOUBLE类型带精度标度场景,数据输入超范围不支持报错。

FLOAT(p) [ZEROFILL]

DOUBLE[(M,D)] [ZEROFILL]

DOUBLE PRECISION[(M,D)] [ZEROFILL]

REAL[(M,D)] [ZEROFILL]