数值型的数据类型概述

有以下的几种数据类型:

如果需要获得详细的信息,可以查看每种数据类型对应的文档。

SIGNED,UNSIGNED和ZEROFILL属性

多数的数值类型都可以被定义为SIGNEDUNSIGNED或者ZEROFILL,例子如下:

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

如果被定义为SIGNED,不指定属性(默认),那么存储这类数据时就会用一个比特作为符号位(来表示正负)。 例如,TINYINT SIGNED可以表示-128到127的数。

如果定义了UNSIGNED的属性,那么存储这类数据时不会专门表示符号位,所以可以表示更大的范围。距离来说一个TINYINT UNSIGNED数据可以表示的范围是从0到255。此外,浮点小数和定点小数也可以是UNSIGNED的,在这种情况下,它们只能防止存储负数,但不能够增加表示范围。

如果指定了ZEROFILL属性, 那么这一列就会被设定为无符号的UNSIGNED,并且默认情况下用于填充字段的空格将替换为零。在表达式中或者在[[union|UNION]的一部分中,ZEROFILL会被忽略。这里要指出,ZEROFILL是一个非标准的MySQL和MariaDB的增加属性。

要注意的是,虽然在语法上,属性是具有排他性的,实际上可以指定超过一个的属性。

截止到MariaDB 10.2.7 (MDEV-8659),属性的组合可以重复出现,并且顺序可以是任意的。在这种情况下:

  • 只要出现ZEROFILL就让这一列变为UNSIGNED ZEROFILL
  • 只要出现UNSIGNED就会让这一列变为UNSIGNED

到了MariaDB 10.2.8, 只能够支持以下的组合

  • SIGNED
  • UNSIGNED
  • ZEROFILL
  • UNSIGNED ZEROFILL
  • ZEROFILL UNSIGNED

最后的两个可以被简单地替换为ZEROFILL,但是写成最后两个再语法上仍然可以被识别。

举例

CREATE TABLE zf (
  i1 TINYINT SIGNED,
  i2 TINYINT UNSIGNED,
  i3 TINYINT ZEROFILL
);

INSERT INTO zf VALUES (2,2,2);

SELECT * FROM zf;
+------+------+------+
| i1   | i2   | i3   |
+------+------+------+
|    2 |    2 |  002 |
+------+------+------+

Range范围

如果新增加的一个值超出了这个数据类型能够表示的范围,MariaDB的反应取决于对strict SQL_MODE的设置。

如果strict_mode已经被设置(从MariaDB 10.2.4开始的默认值),MariaDB会返回一个错误。

如果strict_mode没有被设置(直到MariaDB 10.2.3的默认值),MariaDB会调整这个值,让它属于该数据类型能表示的范围,并且返回一个警告。

举例

当设定了strict_mode时:

SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                     |
+---------------+-------------------------------------------------------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------+

CREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED);

INSERT INTO ranges VALUES (257,257,257);
ERROR 1264 (22003): Out of range value for column 'i1' at row 1

SELECT * FROM ranges;
Empty set (0.10 sec)

没有设定strict_mode时:

SHOW VARIABLES LIKE 'sql_mode%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+

CREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED);

INSERT INTO ranges VALUES (257,257,257);
Query OK, 1 row affected, 2 warnings (0.00 sec)

SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'i1' at row 1 |
| Warning | 1264 | Out of range value for column 'i3' at row 1 |
+---------+------+---------------------------------------------+
2 rows in set (0.00 sec)

SELECT * FROM ranges;
+------+------+------+
| i1   | i2   | i3   |
+------+------+------+
|  127 |  257 |  255 |
+------+------+------+

Auto_increment属性

AUTO_INCREMENT属性可以被用于为新的行产生唯一的标志。如果需要了解更多,可以参考auto_increment

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.