MySQL数据类型

MySQL 数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的;

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型;

整数类型



Int
(N)中N的涵义PS:定义了 init(5)zerofill 当和int(10)join时显示宽度对不上有可能出现临时表

N表示显示宽度为N,但仍占4字节存储,存储范围不变;

>create table int_test(a int zerofill NOT NULL auto_increment, PRIMARY KEY (a));

>createtable int_test_4(a int(4) zerofill NOT NULL auto_increment, PRIMARY KEY (a));

>select * from int_test_4;

+------------+

|a          |

+------------+

|       0001 |

|       0002 |

|2147483648 |

+------------+

>select * from int_test;

+------------+

|a          |

+------------+

|0000000001 |

|0000000002 |

|2147483648 |

+------------+

关于浮点数类型:1)能不用到尽量不要用,2)浮点数不能用在等号比较的场景

建议TINYINT替换enum

 

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

类型

大小(字节)

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

-838:59:59'/'838:59:59'

HH:MM:SS

时间值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

混合日期和时间值

TIMESTAMP

8

1970-01-01 00:00:00/2037 年某时

YYYYMMDD HHMMSS

混合日期和时间值

PS:日期类型注意事项

MySQL5.6不支持year(2)

Timestamp,datatime从MySQL5.6.5支持自动更新为当前的时间:current timestamp

日期转换:cast(datatime_col as DATE)

>select now()+0;

5.6的us支持

>select now(4),MICROSECOND(now(4));

+--------------------------+---------------------+

|now(4)                   |MICROSECOND(now(4)) |

+--------------------------+---------------------+

|2016-04-16 08:50:01.6589 |             658900 |

+--------------------------+---------------------+

timestamp5.6.6之后支持 null

建议datetime 来替换timestamp 

 

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型;

字符型


PS

varchar与char的区别



varchar
和char 的区别: 

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是: char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)varchar存储可变长字符串,小于255字节时需要1个额外字节(大于255需要2个额外字节)存储长度,最大长度为65533字节(所有列总和);
char存储定长,读取时会截断末尾空格,长度最大为255字符;

1)CHAR(M)的涵义:

实际分配的长度是:M*字符编码长度=存储空间

例如:存储了255个字符 中文汉字是占用3个字节

255*3 = 765  一共是765字节


2
)varchar(N)中N的涵义
最大存储N个字符;varchar(5)和varchar(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)
例如:

varchar(200)utf8下面占用多少字节

200*3+ 2

varchar(64)  utf8 

64*3=192<255
192+1=193

建议:

通常使用MySQL是innodb引擎 innodb引擎本来就是变长存储

行存储着:

trx_id, row-id,rollback, filed_pointer, null-flag, filed1,....

innodb存储引擎推荐varchar

char更快是针对MyISAM这种堆表 char 定长分配会更快一点

计算例子

举两个例说明一下实际长度的计算。

a)若一个表只有一个varchar类型,如定义为

createtable t4(c varchar(N)) charset=gbk;

则此处N的最大值为(65535-1-2)/2= 32766。

减1的原因是实际行存储从第二个字节开始’;

减2的原因是varchar头部的2个字节表示长度;

除2的原因是字符编码是gbk。

b)若一个表定义为

createtable t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

减1和减2与上例相同;

减4的原因是int类型的c占4个字节;

减30*3的原因是char(30)占用90个字节,编码是utf8。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值