Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql使用合适的字段和字段长度

mysql中怎样使用合适的字段和字段长度

作者:铭记T

这篇文章主要介绍了mysql中怎样使用合适的字段和字段长度问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

下面是mysql一个字段中含有哪些信息

一般重要的字段为类型,长度,属性,非空,索引,自增等等。

注:A_I:auto_increment,代表自增。

字段的类型有好多种,先说下字段中比较常用的类型和长度

整数型

1、整数型的数值类型已经限制了取值范围,有符号整型和无符号整型都有,而M值并不代表可以存储的数值字符长度,它代表的是数据在显示时显示的最小长度;

2、当存储的字符长度超过M值时,没有任何的影响,只要不超过数值类型限制的范围;

3、当存储的字符长度小于M值时,只有在设置了zerofill用0来填充,才能够看到效果,换句话就是说,没有zerofill,M值就是无用的。

举例子,如果你设置int(11),那么有个字段值是123,那么这个值在显示宽度上是3位,而设计的是显示的是11位,所以这时候,你如果在字段设计的时候,选择zerofill就可以发现,123变成了00000000123,也就是剩下的8位用0补足了。

所以我们在设计mysql数据库时,建表时,mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。

所以,就用这些默认的显示长度就可以了。不用再去自己填长度,比如搞个int(10)、tinyint(1)之类的,基本没用。而且导致表的字段类型多样化。

字符串型

CHAR(M), VARCHAR(M)

CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。

总结一下,从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点,所有当需要大量查询需求的时候,用char。当对于保存数据量过大的需求时,为了节省储存空间用varchar。

TEXT

最大长度为65,535(2的16次方–1)字符的TEXT列。

Text主要是用来存放非二进制的文本,如论坛帖子,题目,或者百度知道的问题和回答之类。TEXT列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。其实可以总结为用来储存大批量的文本信息的时候,使用TEXT。

总结

1,长度的区别,char范围是0~255,varchar最长是64k,如果遇到了大文本,考虑使用text,最大能到4G。

2,效率来说基本是char>varchar>text。

3,char和varchar可以有默认值,text不能指定默认值。

时间型

datetime和timestamp的区别:

1.datetime 的日期范围比较大;如果有1970年以前的数据还是要用datetime.但是timestamp 所占存储空间比较小。

2.timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时,timestamp 列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。

3.timestamp比较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响。

字段的属性值及用处

UNSIGNED ZEROFILL:刚说过了,数字型字段当存储的字符长度小于INT(M)中的M值时,只有在设置了zerofill用0来填充,才能够看到效果,换句话就是说,没有zerofill,M值就是无用的。

timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下

1,CURRENT_TIMESTAMP 

当要向数据库执行insert操作时,如果有个timestamp字段属性设为

 CURRENT_TIMESTAMP,则无论这个字段有没有set值都插入当前系统时间

2,ON UPDATE CURRENT_TIMESTAMP

当执行update操作是,并且字段有ON UPDATE CURRENT_TIMESTAMP属性。则字段无论值有没有变化,它的值也会跟着更新为当前UPDATE操作时的时间。

字段的索引以及设置

先说下对索引的最简单的理解:

如果你给一个唯一性的字段加上索引,比如一个字段是房间号,你不设置字段的情况下去搜索RoomNumber=101,那么数据库会去一条一条的搜索数据库中的RoomNumber字段,直到找到101给你返回,但如果你把RoomNumber设置为索引,那么数据库就会直接找到RoomNumber=101这条信息给你返回。

所以索引的作用是加快数据库搜索的效率,但是同样的,你给一个字段设置为索引,是要消耗资源的。

说一下字段的长度问题

比如不同的酒店的房间号的方式是不同的,可能是101,或者是FD101,再或者是亚特兰蒂斯101,这样不确定的字段,为了提高表的复用性,我们可以给出一个长度,比如char(32),我们可以确定酒店的房间号无论如何都会超过这个长度,这样就可以在节省空间的情况下适应所有的情况,

但是还有一种情况比如数据库中要存MAC地址,MAC地址格式为XX-XX-XX-XX-XX-XX,一共为12个数字和五个分隔符,那么我们就可以直接char(17)来定死这个字段的长度,因为无论如何MAC地址都不会超过17位。

其实也会有人觉得我定为char(32)那能比char(17)的查询效率低多少?确实微乎其微,但是从习惯的角度来说,建表要养成一种好的习惯,所以当我们可以确定一个字段的长度的时候,就要直接用规则定死,避免掉后期可能出现的优化。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文