更新时间:2024-12-06 GMT+08:00

数值数据类型

整数类型

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

整数类型公共差异说明:

  • 输入格式:
    • MySQL

      对于类似“asbd”、“12dd”、“12 12”等字符场景的输入,会采取截断或返回0值并上报WARNING处理,在严格模式时插表会失败。

    • GaussDB
      • 整数类型(TINYINT、SMALLINT、MEDIUMINT、INT、INTEGER、BIGINT)的输入,当非法字符串部分被截断时,如“12@3”,会直接截断并无提示信息,插表成功。
      • 当整数类型全部被截断(如“@123”)或字符串为空时,返回0,且插表成功。
  • 操作符:
    • +、-、*操作符

      GaussDB:INT/INTEGER/SMALLINT/BIGINT在进行运算时,返回值为类型本身,不会向上提升类型,当返回值超范围时报错。

      MySQL:支持提升类型到BIGINT后计算。

    • |、&、^、~运算符

      GaussDB:在类型所占用BIT位中计算;GaussDB中^表示指数运算,如需使用异或运算符,使用#替换。

      MySQL:提升类型计算。

  • 负数显示类型转换:

    GaussDB:宽松模式结果为0,严格模式报错。

    MySQL:依据其对应的二进制将最高位替换成数值位计算结果,例如(-1)::uint4 = 4294967295。

  • 其他差异:

    INT[(M)]精度,MySQL控制格式化输出,GaussDB仅语法支持,不支持功能。

  • 聚集函数:
    • variance:GaussDB表示样本方差,MySQL表示总体方差。
    • stddev:GaussDB表示样本标准差,MySQL表示总体标准差。
  • 显示宽度:
    • 在为整型数字列指明宽度信息时,如果不同时指定ZEROFILL,则宽度信息在表结构描述中不显示。
    • INSERT语句插入字符类型字段,GaussDB统一补齐0后插入。
    • JOIN USING语句,涉及类型推导,MySQL默认第一张表列,GaussDB若结果为有符号类型则宽度信息失效,否则为第一张表字段宽度。
    • greatest/least、ifnull/if、case when/decode,MySQL不补齐0,GaussDB在类型及宽度信息一致时补齐0。
    • 作为函数/存储过程出入参、返回值时,MySQL支持功能、GaussDB语法不报错功能不支持。

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)