int型包括(tinyint, smallint, mediumint, int, bigint)
tinyint是1个字节表达范围就是2的8次方(-128-128) 或者(0-255) 很多人不明白为什么有两种情况,因为在计算机中有一种说法叫做无符号,也就是全部是正整数,所以在用MySQL 选择整形字段的时候一定要加上unsigned也就是无符号,因为负数基本不会用到。
smallint是2个字节表达范围2的16次方
smallint是3个字节表达范围2的24次方
int是4个字节表达范围2的32次方,记住这个类型是不能存储手机号的,很多人用它存然后直接报错了,因为int最长到10长度,手机号是11位,所以如果存手机号我的建议就是下面的char类型
bigint是8个字节表达方位就是2的64次方。
char型
表达范围0-255字节数,如果是存字母就是255个,因为每个字母只占一个字节,无论是什么编码,如果是存gbk存中文就是2个字节代表一个汉字,所以就是255/2,如果是utf8编码就是255/3,因为utf8编码下的中文占用三个字节代表一个汉字。正确的说应该叫做Unicode编码 又叫做万国码,他的实现有utf8
varchar型
表达范围是0-65535字节,我有一个长辈同事,年龄较大,他到现在还认为varchar最大是0-255,这是错误的,如果是在MySQL5.0.3 之前的版本是对的,后面的版本都已经改成了65535字节理论上存储汉字utf8就是2000多个。
text型
表达范围就是65535字节,一般用来存商品描述,等字符数比较多的等,它也有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,存储容量不同,含有字符集。
blob型
以二进制形式存储数据,是的可以存储图片。度出去依然是图片。
decimal型
DECIMAL列的声明语法是DECIMAL(M,D), M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254), D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M,一般用来存储money 也就是钱比如:decimal(10,2),他是以字符串形式存储数字的,不会引起存储的数据不正常,缺斤短两,存储精度需求高的最好选择这个字段,那些选择bigint类型存钱的 真不知道是怎么想的。应该是不知道有这个字段类型吧
float型
浮点型,也就是存小数,效果一般。
enum型
枚举类型,就是建字段的时候输入几个默认的字符,存储也只能存储这几个字符中的一个。例如:enum(“Y”,‘’N”);
set型
一个集合。可以有0到64个值,均来自于指定内容和enum类似,但是enum只能存储一个值,但是set可以存储多个值,如果用多个值用逗号隔开存储。
date型
存储日期格式:‘YYYY-MM-DD‘,范围:‘1000-01-01‘到‘9999-12-31‘。
time型
存储时间格式:‘HH:MM:SS‘;
datetime
其实就是date和time合起来,存储日期和时间格式:‘YYYY-MM-DD HH:MM:SS‘,范围:‘1000-01-01 00:00:00‘到‘9999-12-31 23:59:59‘。
timestamp型(时间戳)
格式:‘YYYYMMDDHHMMSS‘、‘YYMMDDHHMMSS‘、‘YYYYMMDD‘、‘YYMMDD‘,范围:‘1970-01-01 00:00:00‘到‘2037-01-01 00:00:00‘。
一般存储时间还是用int型,存储时间戳
year型
存储年份的,格式”YYYY“;
下面我写点 我对建表的一些理解和建议:
建表的时候最好有主键id,主键是可以没有的,但是为了关联和查询快最好使用int型当做主键,记得是unsigned(无符号);
2、 我看看到很多人为了存储几十到几百的数字使用了,int(3) 这样的类型,其实这样做是不对的,因为只要是int就是占用4个字节,无论是存多少相当于多余出来的浪费了;
3、char和varchar一个是定长一个是可变长度,一般char存储手机号,密码定长加密过的,为什么不建议varchar,因为varvhar类型是变长,在搜索上会慢于char型,如果用户表的登录和密码 最好选择char这样效果会好很多,查询起来很快,其他的字段可以看情况选择varchar类型,告诉大家一个很多人不知道的东西例如:char(10)和varchar(10),都存储10个字符,varchar 会多占用一个字节,因为需要存储长度,计算机在搜索的时候定长的数据搜索起来会更快;
4、 能用定长的字段就用定长,能用更紧凑的类型就用更紧凑的类型。效果会好很多;
5、建表的时候字段要合理,不是多建在一个表里,也不是非得都拆开放,具体情况看使用场景;
6、建表的时候在最常where的字段加上索引,普通索引就够了,不过不一定,例如邮箱或者手机号,这些可以加一些唯一索引(uniqie) ,这样可以保证数据唯一,查询起来也更快;
7、 根据使用场景和业务,添加不同的索引,索引常用的有:主键索引,唯一索引,普通索引, 和全文索引。可以将多个字段放在一起建索引叫做,联合索引,例如我将用户名和密码加上索引了,其实这样不建议,因为搜索的时候,最好不要select * from table where username=”usename” and password=”password”,而是要select * from table where username=”username” ,查询出来后再将结果和password对比;
8、查询数据的时候能用主键,就用主键,这样查询MySQL不需要扫描表而是像人翻目录一样,立马找出来,其实MySQL所有的索引建立都是为了这个”目录“,能够在查询的时候立马找出来;
9、如果考虑到将来数据增长会很快,可以在建表的时候做好分表,比如评论表,可以根据一个hash算法,建立多个评论表,这样查询起来会好很多,其实无非就是将大块的数据,分散开,减少大面积的表扫描