共计 5820 个字符,预计需要花费 15 分钟才能阅读完成。
MySQL 的数据类型
次要包含以下五大类
- 整数类型:bit、bool、tinyint、smallint、mediumint、int、bigint
- 浮点数类型:float、double、decimal
- 字符串类型:char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext
- 日期类型:Date、DateTime、TimeStamp、Time、Year
- 其余数据类型:暂不介绍,用的比拟少。
整数类型
[]蕴含的内容是可选的,默认是有符号类型的,无符号的须要在类型前面跟上 unsigned
示例 1:有符号类型
`mysql> create table demo1(c1 tinyint);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into demo1 values(-pow(2,7)),(pow(2,7)-1);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from demo1;
+------+
| c1 |
+------+
| -128 |
| 127 |
+------+
2 rows in set (0.00 sec)
mysql> insert into demo1 values(pow(2,7));
ERROR 1264 (22003): Out of range value for column 'c1' at row 1`
demo1 表中 c1 字段为 tinyint 有符号类型的,能够看一下下面的演示,有超出范围报错的。
对于数值对应的范畴计算形式属于计算机根底的一些常识,能够去看一下计算机的二进制示意相干的文章。
示例 2:无符号类型
`mysql> create table demo2(c1 tinyint unsigned);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into demo2 values (-1);
ERROR 1264 (22003): Out of range value for column 'c1' at row 1
mysql> insert into demo2 values (pow(2,8)+1);
ERROR 1264 (22003): Out of range value for column 'c1' at row 1
mysql> insert into demo2 values (0),(pow(2,8));
mysql> insert into demo2 values (0),(pow(2,8)-1);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from demo2;
+------+
| c1 |
+------+
| 0 |
| 255 |
+------+
2 rows in set (0.00 sec)`
c1 是无符号的 tinyint 类型的,插入了正数会报错。
类型 (n) 阐明
在开发中,咱们会碰到有些定义整型的写法是 int(11),这种写法个人感觉在开发过程中没有什么用处,不过还是来说一下,int(N)咱们只须要记住两点:
- 无论 N 等于多少,int 永远占 4 个字节
- N 示意的是显示宽度,有余的用 0 补足,超过的忽视长度而间接显示整个数字,但这要整型设置了 unsigned zerofill 才无效
看一下示例,了解更不便:
``mysql> CREATE TABLE test3 (
`a` int,
`b` int(5),
`c` int(5) unsigned,
`d` int(5) zerofill,
`e` int(5) unsigned zerofill,
`f` int zerofill,
`g` int unsigned zerofill
);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test3 values (1,1,1,1,1,1,1),(11,11,11,11,11,11,11),(12345,12345,12345,12345,12345,12345,12345);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test3;
+-------+-------+-------+-------+-------+------------+------------+
| a | b | c | d | e | f | g |
+-------+-------+-------+-------+-------+------------+------------+
| 1 | 1 | 1 | 00001 | 00001 | 0000000001 | 0000000001 |
| 11 | 11 | 11 | 00011 | 00011 | 0000000011 | 0000000011 |
| 12345 | 12345 | 12345 | 12345 | 12345 | 0000012345 | 0000012345 |
+-------+-------+-------+-------+-------+------------+------------+
3 rows in set (0.00 sec)
mysql> show create table test3;
| Table | Create Table
| test3 | CREATE TABLE `test3` (`a` int(11) DEFAULT NULL,
`b` int(5) DEFAULT NULL,
`c` int(5) unsigned DEFAULT NULL,
`d` int(5) unsigned zerofill DEFAULT NULL,
`e` int(5) unsigned zerofill DEFAULT NULL,
`f` int(10) unsigned zerofill DEFAULT NULL,
`g` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)``
show create table test3; 输入了表 test3 的创立语句,和咱们原始的创立语句不统一了,原始的 d 字段用的是无符号的,能够看出当应用了 zerofill 主动会将无符号晋升为有符号。
阐明:
int(5)输入宽度不满 5 时,后面用 0 来进行填充
int(n)中的 n 省略的时候,宽度为对应类型无符号最大值的十进制的长度,如 bigint 无符号最大值为 2 的 64 次方 - 1 等于 18,446,744,073,709,551,615;
长度是 20 位,来个 bigint 右边 0 填充的示例看一下
``mysql> CREATE TABLE test4 (`a` bigint zerofill);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test4 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> select *from test4;
+----------------------+
| a |
+----------------------+
| 00000000000000000001 |
+----------------------+
1 row in set (0.00 sec)``
下面的后果中 1 后面补了 19 个 0,和冀望的后果统一。
float 数值类型用于示意单精度浮点数值,而 double 数值类型用于示意双精度浮点数值,float 和 double 都是浮点型,而 decimal 是定点型。
浮点型和定点型能够用类型名称后加(M,D)来示意,M 示意该值的总共长度,D 示意小数点前面的长度,M 和 D 又称为精度和标度。
float 和 double 在不指定精度时,默认会依照理论的精度来显示,而 DECIMAL 在不指定精度时,默认整数为 10,小数为 0。
示例 1(重点)
`mysql> create table test5(a float(5,2),b double(5,2),c decimal(5,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test5 values (1,1,1),(2.1,2.1,2.1),(3.123,3.123,3.123),(4.125,4.125,4.125),(5.115,5.115,5.115),(6.126,6.126,6.126),(7.116,7.116,7.116),(8.1151,8.1151,8.1151),(9.1251,9.1251,9.1251),(10.11501,10.11501,10.11501),(11.12501,11.12501,11.12501);
Query OK, 7 rows affected, 5 warnings (0.01 sec)
Records: 7 Duplicates: 0 Warnings: 5
mysql> select * from test5;
+-------+-------+-------+
| a | b | c |
+-------+-------+-------+
| 1.00 | 1.00 | 1.00 |
| 2.10 | 2.10 | 2.10 |
| 3.12 | 3.12 | 3.12 |
| 4.12 | 4.12 | 4.13 |
| 5.12 | 5.12 | 5.12 |
| 6.13 | 6.13 | 6.13 |
| 7.12 | 7.12 | 7.12 |
| 8.12 | 8.12 | 8.12 |
| 9.13 | 9.13 | 9.13 |
| 10.12 | 10.12 | 10.12 |
| 11.13 | 11.13 | 11.13 |
+-------+-------+-------+
11 rows in set (0.00 sec)`
后果阐明(留神看):
c 是 decimal 类型,认真看一下输出和输入,发现 decimal 采纳的是四舍五入
认真看一下 a 和 b 的输出和输入,尽然不是四舍五入,一脸闷逼,float 和 double 采纳的是四舍六入五成双
decimal 插入的数据超过精度之后会触发正告。
什么是四舍六入五成双?
就是 5 以下舍弃 5 以上进位,如果须要解决数字为 5 的时候,须要看 5 前面是否还有不为 0 的任何数字,如果有,则间接进位,如果没有,须要看 5 后面的数字,若是奇数则进位,若是偶数则将 5 舍掉
示例 2
咱们将浮点类型的(M,D)精度和标度都去掉,看看成果:
`mysql> create table test6(a float,b double,c decimal);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test6 values (1,1,1),(1.234,1.234,1.4),(1.234,0.01,1.5);
Query OK, 3 rows affected, 2 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 2
mysql> select * from test6;
+-------+-------+------+
| a | b | c |
+-------+-------+------+
| 1 | 1 | 1 |
| 1.234 | 1.234 | 1 |
| 1.234 | 0.01 | 1 |
+-------+-------+------+
3 rows in set (0.00 sec)`
阐明:
a 和 b 的数据正确插入,而 c 被截断了
浮点数 float、double 如果不写精度和标度,则会依照理论显示
decimal 不写精度和标度,小数点前面的会进行四舍五入,并且插入时会有正告!
再看一下上面代码:
`mysql> select sum(a),sum(b),sum(c) from test5;
+--------+--------+--------+
| sum(a) | sum(b) | sum(c) |
+--------+--------+--------+
| 67.21 | 67.21 | 67.22 |
+--------+--------+--------+
1 row in set (0.00 sec)
mysql> select sum(a),sum(b),sum(c) from test6;
+--------------------+--------------------+--------+
| sum(a) | sum(b) | sum(c) |
+--------------------+--------------------+--------+
| 3.4679999351501465 | 2.2439999999999998 | 4 |
+--------------------+--------------------+--------+
1 row in set (0.00 sec)`
从下面 sum 的后果能够看出 float、double 会存在精度问题,decimal 精度失常的,比方银行对统计后果要求比拟精准的倡议应用 decimal。
日期类型
字符串类型
char 类型占用固定长度,如果寄存的数据为固定长度的倡议应用 char 类型,如:手机号码、身份证等固定长度的信息。
表格中的 L 示意存储的数据自身占用的字节,L 以外所需的额定字节为寄存该值的长度所需的字节数。
MySQL 通过存储值的内容及其长度来解决可变长度的值,这些额定的字节是无符号整数。
请留神,可变长类型的最大长度、此类型所需的额定字节数以及占用雷同字节数的无符号整数之间的对应关系:
例如,MEDIUMBLOB 值可能最多 2 的 24 次方 – 1 字节长并须要 3 个字节记录其长度,3 个字节的整数类型 MEDIUMINT 的最大无符号值为 2 的 24 次方 – 1。
mysql 类型和 java 类型对应关系
数据类型抉择的一些倡议
- 选小不选大:个别状况下抉择能够正确存储数据的最小数据类型,越小的数据类型通常更快,占用磁盘,内存和 CPU 缓存更小。
- 简略就好:简略的数据类型的操作通常须要更少的 CPU 周期,例如:整型比字符操作代价要小得多,因为字符集和校对规定 (排序规定) 使字符比整型比拟更加简单。
- 尽量避免 NULL:尽量制订列为 NOT NULL,除非真的须要 NULL 类型的值,有 NULL 的列值会使得索引、索引统计和值比拟更加简单。
- 浮点类型的倡议对立抉择 decimal
- 记录时间的倡议应用 int 或者 bigint 类型,将工夫转换为工夫戳格局,如将工夫转换为秒、毫秒,进行存储,不便走索引