原文地址http://www.cnblogs.com/xrq730/p/5260294.html,转载请注明出处,谢谢!
文章,也有博友在我的有些文章中留言,希望我可以写一些文章,公司项目一直很忙,但是每天也尽量腾出一些时间写一些东西,主要针对工作中一些常用的知识点系统性的梳理(可能我们在工作中只是纯粹的使用而已,不会去进行总结、归纳)。
内容是MysqL数据类型,之前写MysqL系列文章的时候一直忽略的一个知识点,现在想来,我们学习一门语言,无非从两个方面入手:
文章的梳理,可以把MysqL数据结构这块都归纳清楚。
- 8388608TB-->8192PB
一定要为合适的列选取合适的数据类型,即到底用不用得到这种数据类型?举个例子:
- 枚举值,选用TINYINT就足够了,但在开发场景下却使用了BIGINT,这就造成了资源浪费
MysqL本质上是一个存储,以Java为例,可以使用byte类型的地方使用了long类型问题不大,因为绝大多数的对象在程序中都是短命对象,方法执行完毕这块内存区域就被释放了,7个字节实际上不存在浪不浪费一说。但是MysqL作为一个存储,8字节的BIGINT放那儿就放那儿了,占据的空间是实实在在的。
代码时候报错"Out of range value for column 'num' at row 1",即很清楚的我们可以看到插入的数字范围越界了,这也同样反映出MysqL中整型默认是带符号的。
- 显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字,但这要整型设置了unsigned zerofill才有效
sql:
MysqL中浮点型有两种,分别为float、double,它们三者用一张表格总结一下:
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_float <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">1.237<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_float <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">10.233<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_float <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">100.233<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_float <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">1000.233<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_float <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">10000.233<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_float <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">100000.233<span style="color: #000000;">);
<span style="color: #0000ff;">select <span style="color: #808080;">* <span style="color: #0000ff;">from test_float;
显示结果为:
用法规则:
- 支持五位,即小数点前只支持三位数,所以我们并没有看到1000.23、10000.233、100000.233这三条数据的插入,因为插入都报错了
sql看一下就明白了:
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_decimal <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">1234567.66,<span style="color: #800000; font-weight: bold;">12345678990000000.66,<span style="color: #800000; font-weight: bold;">12345678990000000.66<span style="color: #000000;">);<span style="color: #0000ff;">
写入数据库的数据未必是插入数据库的数据,而decimal无论写入数据中的数据是多少,都不会存在精度丢失问题,这就是我们要引入decimal类型的原因,decimal类型常见于银行系统、互联网金融系统等对小数点后的数字比较敏感的系统中。
- decimal(M,D)的规则和float/double相同,但区别在float/double在不指定M、D时默认按照实际精度来处理而decimal在不指定M、D时默认为decimal(10,0)
接着我们看一下MysqL中的日期类型,MysqL支持五种形式的日期类型:date、time、year、datetime、timestamp,用一张表格总结一下这五种日期类型:
MysqL的时间类型的知识点比较简单,这里重点关注一下datetime与timestamp两种类型的区别:
- MysqL会取当前时间
- 显示的时间都依赖于当前时区
最后看一下常用到的字符型,说到MysqL字符型,我们最熟悉的应该就是char和varchar了,关于char和varchar的对比,我总结一下:
- char是固定长度字符串,其长度范围为0~255且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足;varchar为可变长度字符串,在utf8编码的数据库中其长度范围为0~21844
- char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1或+2或+3
- MysqL处理char类型数据时会将结尾的所有空格处理掉而varchar类型数据则不会
关于第一点、第二点,稍后专门开一个篇幅解释,关于第三点,写一下sql验证一下:
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_string <span style="color: #0000ff;">values(<span style="color: #ff0000;">'<span style="color: #ff0000;"> a<span style="color: #ff0000;">',<span style="color: #ff0000;">'<span style="color: #ff0000;"> a<span style="color: #ff0000;">'<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_string <span style="color: #0000ff;">values(<span style="color: #ff0000;">'<span style="color: #ff0000;">a <span style="color: #ff0000;">',<span style="color: #ff0000;">'<span style="color: #ff0000;">a <span style="color: #ff0000;">'<span style="color: #000000;">);
<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_string <span style="color: #0000ff;">values(<span style="color: #ff0000;">'<span style="color: #ff0000;"> a <span style="color: #ff0000;">',<span style="color: #ff0000;">'<span style="color: #ff0000;"> a <span style="color: #ff0000;">');
函数来看一下结果:
验证了我们的结论,char类型数据并不会取最后的空格。
这部分和具体编码方式有关,且MysqL版本我现在使用的是5.7,当然5.0之后的都是可以的。
sql创建表,utf8的编码格式:
提示,我们把大小改为21845,执行依然报错:
改为21844就不会有问题,因此在utf8编码下我们可以知道varchar(M),M最大=21844。那么gbk呢:
- MysqL要求一个行的定义长度不能超过65535即64K
- 255时会专门有两个字节记录varchar型字符串的长度,把这一点和上一点结合,那么65535个字节实际可用的为65535-3=65532个字节
如果表中同时存在int、double、char这些数据,需要把这些数据所占据的空间减去,才能计算varchar(M)型数据M最大等于多少。
MysqL单行最大数据量为64K。
当varchar(M)的M大于某些数值时,varchar会自动转为text:
- 255时转为tinytext
- 500时转为text
- 20000时转为mediumtext
内容varchar和text没有区别,同事varchar(M)和text的区别在于:
能用varchar就用varchar而不用text(存储效率高),varchar(M)的M有长度限制,之前说过,如果大于限制,可以使用mediumtext(16M)或者longtext(4G)。