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):年份