
# 数值数据类型
#### 整数类型
除特别说明外，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                       | 支持，存在差异    | 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兼容的用法）。                                                                                                                                                                               |
| 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\])\] | 支持，存在差异    | - 操作符：GaussDB中"\^"表示指数运算，如需使用异或运算符，使用"#"替换；MySQL中"\^"表示异或。  - 取值范围：精度M，标度D不支持浮点型数值输入，只支持整型数值输入。  - 输入格式：当字符串入参全部被截断时不会报错，如"@123"；只有被部分截断时才会报错，如"12@3"。   |
| DEC\[(M\[,D\])\]     | 支持，存在差异    | - 操作符：GaussDB中"\^"表示指数运算，如需使用异或运算符，使用"#"替换；MySQL中"\^"表示异或。  - 取值范围：精度M，标度D不支持浮点型数值输入，只支持整型数值输入。  - 输入格式：当字符串入参全部被截断时不会报错，如"@123"；只有被部分截断时才会报错，如"12@3"。   |
| 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) ```    |
   
