MySQL数据类型

a. 整型

整型占字节大小(单位byte)数值范围(unsigned)数值范围(signed) 
tinyint 1 (0,255) (-128,127)  
smallint 2 (0,65 535) (-32 768,32 767)  
mediumint 3 (0,16 777 215) (-8 388 608,8 388 607)  
int 4 (0,4 294 967 295) (-2 147 483 648,2 147 483 647)  
bigint 8 (0,18 446 744 073 709 551 615) (-9,223,372,036,854,775,808,9 223 372 036 854 775 807)  

整型应用细节:

。生产中应该选择哪种类型

在满足业务所需数值范围的情况下,选择占用字节更少的类型。可以节省内存空间

。int(11) 、tinyint(4)与 zerofill(0填充)的问题

只是显示属性,没有实际意义,只表示宽度,不会影响字段的值

alter table t1 modify a tinyint zerofill not null;

a tinyint(3) unsigned zerofill NOT NULL

负数加zerofill是不被允许的

 

。int类型转换为bigint注意事项

如果该列是主键,则无法使用onlineddl

如果不是主键,支持onlineddl

onlineddl:执行ddl语句,可以支持dml语句,不会阻塞dml语句

 

。ipv4地址选择什么类型存放

建议使用int类型存储。

inet_aton('ip') 将ip地址转为整型select inet_aton('255.255.255.255');

inet_ntoa('int') 将整型转为ip地址 select inet_ntoa('4294967295');

 

 

b.浮点型

浮点型占字节大小(单位byte)精度  
float 4 单精度    
double 8 双精度    
decimal 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 高精度    

浮点型应用细节:

。生产中浮点数如何选择?

凡是涉及到资金的,建议选择decimal。

。测试环境中插入随机字符?

floor() :向下取整 select floor('1.23');

ceil():select ceil('1.23');

round():select round(0.54); select round(0.5354, 2);

rand():取0-1随机值 select rand();

公式:floor(i+rand()(j-i)) 随机取i-j整数 select floor(1+rand()(10-1));随机取1-10

insert into t2 values(repeat('a', floor(1+rand()*(30-1))));

 

。float长度细节

float没有定义长度,默认占4字节

float(p) , 0<=p<=24,占4字节

25<=p<=53,占8字节

 

。float列不指定精度时,不能做等值查询

1622081536938

等值查询结果为空。

。decimal最大长度

decimal(M,D) M最大值65,D最大值30。

 

c.字符串类型

字符串类型说明N的含义是否有字符集最大长度
char(n) 定长字符 字符 255
varchar(n) 变长字符 字符 65535
binary(n) 定长二进制字节 字节 255
varbinary(n) 变长二进制字节 字节 65535
tinyblob 二进制大对象 字节 256
blob 二进制大对象 字节 16k
mediumblob 二进制大对象 字节 16M
longblob 二进制大对象 字节 4G
tinytext 大对象 字节 256
text 大对象 字节 16k
mediumtext 大对象 字节 16M
longtext 大对象 字节 4G

字符串类型应用细节:

。varchar是变长类型,需要额外的1-2个字节

varchar(30) <255 额外占用1字节,>255额外占2字节

 

。char(30)、varchar(30),在utf8字符集下,占字节数计算

char(30) 占用字节数=30*3

varchar(30) 占用字节数=30*3+1

 

。varchar实际长度超过255字节时,会被作为text处理

 

。varchar长度越长排序时使用更多的内存空间,所以varchar类型的字段长度越短越好

 

。字段超长可能会造成页溢出(off page)

page 16k,字段超过page大小的一半,就会发生off page

 

。大文本大字段尽量不要去使用,业务上必须有的话,可以存放到独立子表中

 

。对text列进行排序,只会用到max_sort_length字节去作排序

 

。enum() 枚举类型,细节

enum(v_list), v_list最多可以是65535个,如果不超过255占1字节,超过255占2字节。

 

d.日期类型

日期类型大小范围  
datetime 8 1000-01-01 00:00:00/9999-12-31 23:59:59    
timestamp 4 结束时间是北京时间 2038-1-19 11:14:07    
date 3 1000-01-01/9999-12-31    
time 3 '-838:59:59'/'838:59:59'    
year 1 1901/2155    

日期类型应用细节:

。timestamp,当行被更改时,会自动更新为当前时间

5.6.5之后datetime也可以设置自动更新为当前时间

alter table t3 modify d datetime default current_timestamp on update current_timestamp;

 

。5.6.4之后底层都是以整型存储,效率高,推荐使用datetime

。日期函数

now() 当前时间select now();

cast(now() as date) 时间转换 select cast(now() as date);

posted @ 2021-05-31 21:27  DB哥  阅读(68)  评论(0编辑  收藏  举报