MySQL的数据类型
MySQL数据库支持的数据类型主要有以下几种:
- 整型
- 浮点型
- 字符
- BLOB型
- 枚举和集合类型
- JSON类型(MySQL5.7新增加的支持)
整型
整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT这两类整数类型。MySQL数据库除了支持这两种类型之外,还扩展支持了TINYINT, MEDIUMINT和BIGINT。
MySQL中各种整型占据的字节数和取值范文如下:
| 整数类型 | 字节数 | 无符号数取值范围 | 有符号数取值范围(添加一位符号为,把无符号数除以2) | 默认显示宽度 |
| TINYINT | 1 | 0~2^8 | -128~127 | 4 |
| SMALLINT | 2 | 0~2^16 | -32768~32767 | 6 |
| MEDIUMINT | 3 | 0~2^24 | -8388608~8388607 | 9 |
| INT | 4 | 0~2^32 | -2147483648~2147483647 | 11 |
| INTEGER | 4 | 0~2^32 | -2147483648~2147483647 | 11 |
| BIGINT | 8 | 0~2^64 | -(2^64)/2~[(2^64)/2] -1 | 20 |
INT类型和INTEGER类型的字节数和取值范围是一样,在MySQL中INT类型和INTEGER类型是一样的。
MySQL支持数据类型的名称后面指定该类型的显示宽度。
数据类型 (显示宽度)
#其中,数据类型参数是整数数据类型的名称,显示宽度参数是指定宽度的数值。
#在建表时,若是没有指定显示宽度,则MySQL使用默认的显示宽度:
mysql> create table tb3(a tinyint, b smallint, c mediumint, d int, e bigint);
Query OK, 0 rows affected (0.02 sec)
mysql> show create table tb3; # 查看默认的显示宽度
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb3 | CREATE TABLE `tb3` (
`a` tinyint(4) DEFAULT NULL,
`b` smallint(6) DEFAULT NULL,
`c` mediumint(9) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
`e` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
整型的zerofill参数和auto_increment参数:
- zerofill,在插入数据长度没有达到默认显示宽度时,用0填充。
mysql> create table tb4(a int(4) zerofill, b int(4)); # 建表时使用zerofill参数 Query OK, 0 rows affected (0.01 sec) mysql> insert into tb4 values(1,2); #插入的数据不足时,用0填充。 Query OK, 1 row affected (0.00 sec) mysql> select * from tb4; +------+------+ | a | b | +------+------+ | 0001 | 2 | +------+------+ 1 row in set (0.00 sec) mysql> insert into tb4 values(10000,20000); #插入超过指定宽度的数据
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb4; #仍然会正常显示
+-------+-------+
| a | b |
+-------+-------+
| 0001 | 2 |
| 10000 | 20000 |
+-------+-------+
2 rows in set (0.00 sec)
mysql> insert into tb4 values(123456789123,123456789123); #插入超过默认宽度的数据会报错
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql>
- auto_increment参数,自增长,需要注意的是自增长序列必须为索引,一张表中,只能有一个自增长的字段。
mysql> create table tb5(a int(4) auto_increment, b int); #直接创建会报错 ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key mysql> create table tb5(a int(4) auto_increment primary key, b int); #自增长列必须为索引 Query OK, 0 rows affected (0.03 sec)
mysql> insert into tb5(b) values(5); #插入字段b数值
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb5; #自增长列是从1开始的
+---+------+
| a | b |
+---+------+
| 1 | 5 |
+---+------+
1 row in set (0.00 sec)
#自增长列的下一个值,是从这个列中最大的一个数值+1,开始的,如下:
mysql> insert into tb5(b) values(8); #插入两条数据
Query OK, 1 row affected (0.01 sec)
mysql> insert into tb5(b) values(9); #插入数据之后,字段a的值为3
Query OK, 1 row affected (0.00 sec)
mysql> insert into tb5 values(-7, 21); #插入字段a的数值为-7
Query OK, 1 row affected (0.01 sec)
mysql> insert into tb5(b) values(23); #再插入一条数据,字段a的值为4,而不是-6
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb5;
+----+------+
| a | b |
+----+------+
| -7 | 21 |
| 1 | 5 |
| 2 | 8 |
| 3 | 9 |
| 4 | 23 |
+----+------+
5 rows in set (0.00 sec)
#可以设置自增长字段的初始值
mysql> create table tb5( a int(4) auto_increment primary key, b int) auto_increment=5; #设置初始值为5
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tb5(b) values(23);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tb5;
+---+------+
| a | b |
+---+------+
| 5 | 23 |
+---+------+
1 row in set (0.00 sec)
mysql> insert into tb5(b) values(21);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tb5;
+---+------+
| a | b |
+---+------+
| 5 | 23 |
| 6 | 21 |
+---+------+
2 rows in set (0.00 sec)
浮点型
MySQL中使用浮点类型和定点数类型来表示小数。浮点数类型包括单精度浮点数和双精度浮点数。定点数类型就是DECIMAL型。
| 类型 | 字节数 | 负数取值范围 | 非负数取值范围 |
| float | 4 | 暂无 | 暂无 |
| double | 8 | 暂无 | 暂无 |
| DECIMAL(M,D)或者DEC(M,D) | M+2 | 暂无 | 暂无 |
MySQL可以指定浮点数和定点数的精度。
数据类型 (M,D)
#M称为精度,是数据的总长度,小数点不占位置;D参数称为标度,指小数点后的长度
浮点数在保存的时候经常会出一些意想不到的结果,建议使用DEC保存。
https://www.cnblogs.com/phpfensi/p/8143313.html 创建mysql数据表的时候,经常会遇到存储小数(浮点数)的情况,如:价格,重量,身高等。 目前大的公司流行三种存储方案: 1、将数据扩大10的倍数达到使用整数类型存储目的。 比如价格,我们经常以分为单位进行存储,也就是将数据扩大100倍,这样元改成分存储。 重量可以用克为单位,如果克还是小数,就以毫克,微克等单位进行存储。 2、使用decimal类型的方式存储 比如价格,我们可以使用两位小数的精度进行存储。强烈不建议采用float或者double的类型存储,会存在精度损失的问题,在以后做值比较的时候,容易出现不正确的结果。 3、小数和整数部分分开存储。 比如价格3.14,我们存成两个字段,一个字段存储3,一个字段存储14,一般情况下用的少。当存储的数据范围超出decimal的范围时,可以将数据按照整数和小数拆分。