详解MySQL数据类型
原文地址http://www.cnblogs.com/xrq730/p/5260294.html,转载请注明出处,谢谢!
|
- 8388608TB-->8192PB
一定要为合适的列选取合适的数据类型,即到底用不用得到这种数据类型?举个例子:
MySQL本质上是一个存储,以Java为例,可以使用byte类型的地方使用了long类型问题不大,因为绝大多数的对象在程序中都是短命对象,方法执行完毕这块内存区域就被释放了,7个字节实际上不存在浪不浪费一说。但是MySQL作为一个存储,8字节的BIGINT放那儿就放那儿了,占据的空间是实实在在的。
num ) engineinnodb charset test_tinyint ( test_tinyint ();
MySQL中整型默认是带符号的。
((((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;">2222222222<span style="color: #000000;">); <span style="color: #0000ff;">select <span style="color: #808080;">* <span style="color: #0000ff;">from test_int_width;
数据类型 (,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;
(,(,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 innodb charset<span style="color: #0000ff;">insert <span style="color: #0000ff;">into test_time <span style="color: #0000ff;">values(now(),now(),now());
create_time
最后看一下常用到的字符型,说到MySQL字符型,我们最熟悉的应该就是char和varchar了,关于char和varchar的对比,我总结一下:
- char是固定长度字符串,其长度范围为0~255且与编码方式无关,无论字符实际长度是多少,都会按照指定长度存储,不够的用空格补足;varchar为可变长度字符串,在utf8编码的数据库中其长度范围为0~21844
- char实际占用的字节数即存储的字符所占用的字节数,varchar实际占用的字节数为存储的字符+1或+2或+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之后的都是可以的。
(innodb charset
length too big ( ); BLOB
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 charsetlength too big ( ); BLOB
Row size too large. The maximum row size the used type, the manual. You have change columns
- 255时会专门有两个字节记录varchar型字符串的长度,把这一点和上一点结合,那么65535个字节实际可用的为65535-3=65532个字节
如果表中同时存在int、double、char这些数据,需要把这些数据所占据的空间减去,才能计算varchar(M)型数据M最大等于多少。
当varchar(M)的M大于某些数值时,varchar会自动转为text:
- 255时转为tinytext
- 500时转为text
- 20000时转为mediumtext
能用varchar就用varchar而不用text(存储效率高),varchar(M)的M有长度限制,之前说过,如果大于限制,可以使用mediumtext(16M)或者longtext(4G)。
text存储的是字符串而blob存储的是二进制字符串,简单说blob是用于存储例如图片、音视频这种文件的二进制数据的。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!