详解MySQL数据类型

前端之家收集整理的这篇文章主要介绍了详解MySQL数据类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址http://www.cnblogs.com/xrq730/p/5260294.html,转载请注明出处,谢谢!

文章,也有博友在我的有些文章中留言,希望我可以写一些文章,公司项目一直很忙,但是每天也尽量腾出一些时间写一些东西,主要针对工作中一些常用的知识点系统性的梳理(可能我们在工作中只是纯粹的使用而已,不会去进行总结、归纳)。

内容是MysqL数据类型,之前写MysqL系列文章的时候一直忽略的一个知识点,现在想来,我们学习一门语言,无非从两个方面入手:

文章的梳理,可以把MysqL数据结构这块都归纳清楚。

  • 8388608TB-->8192PB

一定要为合适的列选取合适的数据类型,即到底用不用得到这种数据类型?举个例子:

  • 枚举值,选用TINYINT就足够了,但在开发场景下却使用了BIGINT,这就造成了资源浪费

MysqL本质上是一个存储,以Java为例,可以使用byte类型的地方使用了long类型问题不大,因为绝大多数的对象在程序中都是短命对象,方法执行完毕这块内存区域就被释放了,7个字节实际上不存在浪不浪费一说。但是MysqL作为一个存储,8字节的BIGINT放那儿就放那儿了,占据的空间是实实在在的。

num ) engineinnodb charset test_tinyint ( test_tinyint ();

代码时候报错"Out of range value for column 'num' at row 1",即很清楚的我们可以看到插入的数字范围越界了,这也同样反映出MysqL中整型默认是带符号的

  • 显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字,但这要整型设置了unsigned zerofill才有效

sql:

((((innodb charset<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_int_width <span style="color: #0000ff;">values(<span style="color: #800000; font-weight: bold;">1,<span style="color: #800000; font-weight: bold;">1,<span style="color: #800000; font-weight: bold;">1111111111<span style="color: #000000;">);

<span style="color: #0000ff;">select <span style="color: #808080;">* <span style="color: #0000ff;">from test_int_width;

MysqL中浮点型有两种,分别为float、double,它们三者用一张表格总结一下:

数据类型字节数备注 sql来简单看一下float和double型数据,以float为例,double同理:

(,innodb charset<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.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;">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看一下就明白了:

(,(,decimal_num (,innodb charset<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;">1234567899000000.66,<span style="color: #800000; font-weight: bold;">1234567899000000.66<span style="color: #000000;">);
<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,用一张表格总结一下这五种日期类型:

time

下面我们还是用sql来验证一下:

innodb charset<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_time <span style="color: #0000ff;">values(now(),now(),now());

MysqL的时间类型的知识点比较简单,这里重点关注一下datetime与timestamp两种类型的区别:

  • MysqL会取当前时间
  • 显示的时间都依赖于当前时区

create_time 修改时间",

最后看一下常用到的字符型,说到MysqL字符型,我们最熟悉的应该就是char和varchar了,关于char和varchar的对比,我总结一下:

  1. char是固定长度字符串,其长度范围为0~255且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足;varchar为可变长度字符串,在utf8编码的数据库中其长度范围为0~21844
  2. char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1或+2或+3
  3. MysqL处理char类型数据时会将结尾的所有空格处理掉而varchar类型数据则不会

关于第一点、第二点,稍后专门开一个篇幅解释,关于第三点,写一下sql验证一下:

((innodb charset<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;">'<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的编码格式:

(innodb charset

length too big ( ); BLOB

提示,我们把大小改为21845,执行依然报错:

Row size too large. The maximum row size the used type, counting BLOBs, . This includes storage overhead, the manual. You have change columns

改为21844就不会有问题,因此在utf8编码下我们可以知道varchar(M),M最大=21844。那么gbk呢:

(innodb charset

length too big ( ); BLOB

Row size too large. The maximum row size the used type, the manual. You have change columns

  • 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)。

text存储的是字符串而blob存储的是二进制字符串,简单说blob是用于存储例如图片、音视频这种文件的二进制数据的。

原文链接:https://www.f2er.com/mysql/66489.html

猜你在找的MySQL相关文章