数值型的数据类型概述
有以下的几种数据类型:
- TINYINT
- BOOLEAN - 与TINYINT(1)相同
- SMALLINT
- MEDIUMINT
- INT, 整数
- BIGINT
- DECIMAL, 定点小数
- FLOAT
- DOUBLE, 双精度浮点小数,实数
- BIT
如果需要获得详细的信息,可以查看每种数据类型对应的文档。
SIGNED,UNSIGNED和ZEROFILL属性
多数的数值类型都可以被定义为SIGNED
,UNSIGNED
或者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。