char(M)和varchar(M)的区别:
char的长度是不可变的,而varchar的长度是可变的;
char(M)定义的列的长度为固定的,M取值可以为0~255之间;
varchar(M)定义的列的长度为可变长,M取值可以为0~65535之间;
注意这里的 M 是字符数,可以是M个汉字也可以是M个英文字母,与语言无关
定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格
,而varchar就立马把长度变为4了.
存数据时char类型数据后面的空格会被删除,varchar原样存储;取数据的时候,char类型尾部自动添加的空格会被删除,而varchar尾部的空格仍然保留;
char的存取速度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的;
何时该用char,何时该用varchar:
varchar比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’;
varchar虽然比char节省空间,但是如果一个varchar列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象(如之前给分配的存储空间不足了),而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar会更好一些。而且varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
char定长,一般用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等;
固定长度的。比如使用uuid作为主键,身份证号,手机号,电话,密码等,用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
从空间上考虑,varchar更好,从效率上考虑,char更好。这其中的选择就需要我们根据情况自己考量。
基本在使用时首先考虑varchar,若char更好则用char;
like 只能用于字符串格式
注意sql语句中like只能用于字符串格式字段,若要用于int|date等类型字段需要在sql语句中将字段数据转为char|varchar等字符串类型
;
若int字段有索引,用like查询的话会使索引失效;
若某字段中存储的数据内容为数字,但业务场景中需要like查询等,则可以把该字段设置为char||varchar格式,如手机号虽然为11位数字,但最好用char(11),不要用bigint,即避免了32位系统导致的无法存储问题,又方便模糊查询。
用int表示时间戳字段
存储时间戳时int类型具有更大的优势(时间戳 或 HmdHis 格式)
1、仅占用4个字节,资源占用少,但只能表示到2038年,可到时候改成bigint
2、一般逻辑中经常用到时间范围查询,大小比较等,int类型在建立索引后,查询速度更快。只是在处理简单的数字
3、条件范围搜索可以使用使用between
结论:适合需要进行大量时间范围查询的数据表
手机号 | 电话 | uuid | 身份证号 | 密码 | 门牌号
datetime类型时间保存为时间戳 或 HmdHis 格式