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类型⽤在你需要同时包含⽇期和时间信息的值时。MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显⽰DATETIME值,⽀持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
DATE类型⽤在你仅需要⽇期值时,没有时间部分。MySQL检索并且以'YYYY-MM-DD'格式显⽰DATE值,⽀持的范围是'1000-01-
01'到'9999-12-31'。
TIMESTAMP列类型提供⼀种类型,你可以使⽤它⾃动地⽤当前的⽇期和时间标记INSERT或UPDATE的操作。
TIME数据类型表⽰⼀天中的时间。MySQL检索并且以"HH:MM:SS"格式显⽰TIME值。⽀持的范围是'00:00:00'到'23:59:59'。
datetime和timestamp的区别:
1.datetime 的⽇期范围⽐较⼤;如果有1970年以前的数据还是要⽤datetime.但是timestamp 所占存储空间⽐较⼩。
2.timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时,timestamp 列会⾃动以当前时间
(CURRENT_TIMESTAMP)填充/更新。
3.timestamp⽐较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响。
字段的属性值及⽤处
BINARY:不是函数,是类型转换运算符,它⽤来强制它后⾯的字符串为⼀个⼆进制字符串,可以理解为在字符串⽐较的时候区分⼤⼩写。varchar2最大长度
UNSIGNED:既为⾮负数,⽤此类型可以增加⼀倍数据长度!
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这条信息给你返回。所以索引的作⽤是加快数据库搜索的效率,但是同样的,你给⼀个字段设置为索引,是要消耗资源的。
普通索引(INDEX):最基本的索引,没有任何限制。
唯⼀索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯⼀,但允许有空值。
主键索引(PRIMARY):它 是⼀种特殊的唯⼀索引,不允许有空值。
全⽂索引(FULLTEXT ):仅可⽤于 MyISAM 表, ⽤于在⼀篇⽂章中,检索⽂本信息的, 针对较⼤的数据,⽣成全⽂索引很耗时耗空间。
说⼀下字段的长度问题
位(bit):数据存储的最⼩单位。每个⼆进制数字0或者1就是1个位;
字节(byte): 8个位构成⼀个字节;即:1 byte (字节)= 8 bit(位);
字符:是指计算机中使⽤的字母、数字、字和符号。
⽐如不同的酒店的房间号的⽅式是不同的,可能是101,或者是FD101,再或者是亚特兰蒂斯101,这样不确定的字段,为了提⾼表的复⽤性,我们可以给出⼀个长度,⽐如char(32),我们可以确定酒店的房间号⽆论如何都会超过这个长度,这样就可以在节省空间的情况下适应所有的情况,
但是还有⼀种情况⽐如数据库中要存MAC地址,MAC地址格式为XX-XX-XX-XX-XX-XX,⼀共为12个数字和五个分隔符,那么我们就可以直接char(17)来定死这个字段的长度,因为⽆论如何MAC地址都不会超过17位。
其实也会有⼈觉得我定为char(32)那能⽐char(17)的查询效率低多少?确实微乎其微,但是从习惯的⾓度来说,建表要养成⼀种好的习惯,所以当我们可以确定⼀个字段的长度的时候,就要直接⽤规则定死,避免掉后期可能出现的优化。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。