数据库 之 数据类型 介绍
1 概述
数据类型
.数据长什么样?
.数据需要多少空间来存放?如整数有不同的类型,存储的空间不一样
.系统内置数据类型和用户定义数据类型
.MySql支持多种列类型:(内置数据类型)
.数值类型
.日期/时间类型
.字符串(字符)类型
.选择正确的数据类型对于获得高性能至关重要,三大原则:
.更小的通常更好,尽量使用可正确存储数据的最小数据类型,原则是够用就好
.简单就好,简单数据类型的操作通常需要更少的CPU周期,复杂的话会消耗额外的资源
.尽量避免NULL,如果包含为NULL的列,对MySQL更难优化
2 数据类型
1 整型
.tinyint(m) 1个字节范围(-128~127)
.smallint(m)2个字节范围(-32768~32767)
.mediumint(m)3个字节范围(-8388608~8388607)
.int(m)4个字节范围(-2147483648~2147483647)
.bigint(m)8个字节范围(+-9.22*10的18次方)
取值范围如果加了unsigned,那么最大值就会翻倍,如tinyint unsigned的取值范围为(0~255),表示正整数
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,
在int(M)中,M的值跟int(M)所占多少存储空间并无任何关系。int(3)、int(4)、int(8)在磁盘上都是占用4 btyes的存储空间。说白了,除了显示给用户的方式有点不同外,int(M)跟int数据类型是相同的。
“(M)”指定了int型数值显示的宽度,如果字段数据类型是int(4),则:当显示数值10时,在左边要补上“00”;当显示数值100是,在左边要补上“0”;当显示数值1000000时,已经超过了指定宽度“(4)”,因此按原样输出。
MySQL可以为整型类型指定宽度(这里是表示显示的宽度),例如Int(11),对绝大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,Int(1)和Int(20)是相同的
2 浮点型(float和double),近似值
.float(m,d)单精度浮点型8位精度(4字节) m总个数(88.66,则m为4个数,d为2为小数),d小数位
.double(m,d)双精度浮点型16位精度(8字节) m总个数,d小数位
.设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
这里和awk不一样,awk把小数点也算作一位,但是这里定义的小数,小数点不算一位数。
3 定点数
.在数据库中存放的是精确值,存为十进制
.decimal(m,d)参数m<65是总个数,d<30且d
.MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如,decimal(18,9)小数点两边将各存储9个数字,一共使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占1个字节
定点数一般用来存放财务数据
.浮点类型在存储同样范围的值时,通常比decimal使用更少的
空间。float使用4个字节存储。double占用8个字节
.因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal——例如存储财务数据。但在数据量比较大的时候,可以考虑使bigint代替decimal
4 字符串(char,varchar,_text)
.char(n)固定长度,最多255个字符,如定义20字节,允许短,如实际只有3字节,但是实际在内存或磁盘中存储占用20个字节
.varchar(n)可变长度,最多65535个字符,根据实际位数暂用空间
.tinytext可变长度,最多255个字符
.text可变长度,最多65535个字符
.mediumtext可变长度,最多2的24次方-1个字符
.longtext可变长度,最多2的32次方-1个字符
.BINARY(M)固定长度,可存二进制或字符,允许长度为0-M字节,
.VARBINARY(M)可变长度,可存二进制或字符,允许长度为0-M字节,如存储图片或二进制内容
.内建类型:ENUM枚举, SET集合
.char和varchar:
.1.char(n)若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
.2.char(n)固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(最后可能有一个结束符字符)(n< n>255),所以varchar(4),只存入3个字符也将占用4个字节。
.3.char类型的字符串检索速度要比varchar类型的快
.varchar和text:
.1.varchar可指定n,text不能指定,内部存储varchar是存入的实
际字符数+1个字节(n< n>255),text是实际字符数+2个字节。
.2.text类型不能有默认值
.3.varchar可直接创建索引,text创建索引要指定前多少个字符。
varchar查询速度快于text
除非是写一篇文章或者小短文,考虑用text,如果是普通的字符串,就直接用varchar就可以
5 二进制数据:BLOB
.BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写
.BLOB存储的数据只能整体读出
.TEXT可以指定字符集,BLOB不用指定字符集
6 日期时间类型
.date日期'2008-12-2'
.time时间'12:25:36'
.datetime日期时间'2008-12-222:06:44'
.timestamp自动存储记录修改时间,时间戳,只要表里的任意字段被改动,这个时间戳就会自动变化,这里的日期格式是和datetime一样,如日期时间'2008-12-222:06:44'
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类型的字段可以存放这条记录最后被修改的时间
例子如下
创建一张表
如下
create table datetb (idint(3) not null,t1 date not null,t2 time not null,t3 datetime,t4timestamp,primary key (id));
往表里插入一条记录,如下
insert into datetb values(1,"2017-09-09","12:53:12","2017-09-0910:10:08","2017-09-09 10:10:09");
修改记录t2的值如下
update datetb sett2="01:02:03" where id=1;
实验结果是,timestamp这个字段t4的值会自动变更为当前系统的时间
.YEAR(2), YEAR(4):年份