mysql 列类型选择
原则:
能小不要大
能定不要变
能数值,不要字符串。
1、在精度要求高的应用中,建议使用定点数来存储数值,以保证结果的准确性。
create table t2(price float(9,2),dprice decimal(9,2));
insert into t2 values(1234567.55,1234567.55);
2、录入手机号带来的问题,
使用char(11)会占用较多的字节,gbk占用2字节*11,utf-8占用3*11,
可以使用bigint,宽度是20,只占用8个字节。
3、 ip地址也可以采用int整型。
如果用varchar()来存储ip地址。
255.255.255.255 utf-8字符串会占用15*3+2=47字节,
如果使用int的只占用4个字节。
使用函数进行转换:
inet_aton():把ip地址转换成整数
inet_ntoa();把整数转换成ip地址。
IPv4存储为int型
PHP:
ip2long() :ip地址到整数的转换,
long2ip():整数到ip地址的转换。
MySQL: inet_aton(), inet_ntoa();
4、根据需求选择最小整数类型。比如用户在线状态:离线,在线,离开,忙碌,隐式等,可以采用0,1,2,3,来表示。
5、避免字段内容为null,原因:null不利于索引,要用特殊的字节来标注,在磁盘上占据的空间其实更大。
create table t3(mobile bigint);
create table t5(name char(1) not null default '');
insert into t5 values('a'),('b'),('c');
create table t6(name char(1));
insert into t6 values('a'),(null),('c');
|
NULL的判断只能用is null,is not null
NULL 影响查询速度,一般避免使值为NULL
6、三范式
第一范式:数据的字段不能在分割,只要是关系型数据库则天生就满足第一范式。
第二范式:通俗的说,就是不能有完全相同的两条记录,可以使用一个主键解决。
第三范式:通俗的说,存储的数据不能冗余。