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的范围时,可以将数据按照整数和小数拆分。
MySQL中小数的存储

相关文章:

  • 2021-11-21
  • 2021-09-29
  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-07-21
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-02
  • 2021-08-13
  • 2022-12-23
  • 2021-10-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案