整数类型
除特别说明外,MySQL兼容性MYSQL模式中的数据类型精度、标度、位数大小等默认不支持用浮点型数值定义,建议使用合法的整型数值定义。
整数类型公共差异说明:
GaussDB数据库和MySQL数据库整数类型具体差异请参见表1。
表1 整数类型 | MySQL数据库 | GaussDB数据库 | 差异 |
| 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兼容的用法)。 |
| BOOLEAN | 支持,存在差异 |
| TINYINT[(M)] [UNSIGNED] | 支持,存在差异 | 详情请参见整数类型公共差异说明。 |
| SMALLINT[(M)] [UNSIGNED] | 支持,存在差异 | 详情请参见整数类型公共差异说明。 |
| 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。
其他差异请参见整数类型公共差异说明。 |
| INT[(M)] [UNSIGNED] | 支持,存在差异 | 详情请参见整数类型公共差异说明。 |
| INTEGER[(M)] [UNSIGNED] | 支持,存在差异 | 详情请参见整数类型公共差异说明。 |
| BIGINT[(M)] [UNSIGNED] | 支持,存在差异 | 详情请参见整数类型公共差异说明。 |
任意精度类型
表2 任意精度类型 | MySQL数据库 | GaussDB数据库 | 差异 |
| DECIMAL[(M[,D])] | 支持,存在差异 | - 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输入格式:当字符串入参全部被截断时不会报错,如“@123”;只有被部分截断时才会报错,如“12@3”。
|
| NUMERIC[(M[,D])] | 支持,存在差异 |
| DEC[(M[,D])] | 支持,存在差异 |
| FIXED[(M[,D])] | 不支持 | - |
浮点类型
表3 浮点类型 | MySQL数据库 | GaussDB数据库 | 差异 |
| FLOAT[(M,D)] | 支持,存在差异 | - 分区表支持:FLOAT数据类型不支持KEY键值分区策略分区表。
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
| FLOAT(p) | 支持,存在差异 | - 分区表支持:FLOAT数据类型不支持KEY键值分区策略分区表。
- 操作符:数值类型使用^操作符,与MySQL不一致,GaussDB中^操作符为取指数运算。
- 取值范围:定义精度p时,仅支持使用合法的整型数据类型。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
| DOUBLE[(M,D)] | 支持,存在差异 | - 分区表支持:DOUBLE数据类型不支持KEY键值分区策略分区表。
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
| DOUBLE PRECISION[(M,D)] | 支持,存在差异 | - 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
| REAL[(M,D)] | 支持,存在差异 | - 分区表支持:REAL数据类型不支持KEY值分区策略分区表。
- 操作符:GaussDB中“^”表示指数运算,如需使用异或运算符,使用“#”替换;MySQL中“^”表示异或。
- 取值范围:精度M,标度D不支持浮点型数值输入,只支持整型数值输入。
- 输出格式:对于非法入参一律报错ERROR,不会在sql_mode=''的宽松模式下报WARNING。
|
序列整数
表4 序列整数 | MySQL数据库 | GaussDB数据库 | 差异 |
| SERIAL | 支持,存在差异 | GaussDB中SERIAL具体介绍请参见《开发指南》手册中的“SQL参考 > 数据类型 > 数值类型”章节。 规格上与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引用列的介绍请参见《开发指南》手册中的“SQL参考 > SQL语法 > R > 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) |