一 char和varchar
char(n) 和 varchar(n) 中括号中 n 代表字符的最大个数,并不代表字节个数,比如 CHAR(10) 就可以存储 10 个字符
区别
-
长度
- char的长度不可变;
- varchar的长度可变
-
效率
- 由于char的长度固定,所以修改的时候不需要考虑长度的变化,所以效率会更高;
- varchar在每次修改的时候,需要根据长度来判断所需要占据的空间并开辟不同长度的空间,因此需要做一些额外的操作
-
存储的方式
- char在存储的时候会在字符串右边添加空格,保证存储数据的长度保持一致;实际上,存储的是加了空格之后的数据+一个记录原字符串长度的字节;例如’java’实际上存储的是’java ';同时一定要注意,char类型会自动删除掉字符串末尾的空格,例如传入’abc ‘取出来时会变成’abc’!!!
- varchar在存储的时候存储的是不会补充空格,也不会删掉原有的空格;实际上存储的是原本的字符串+一个记录原字符串长度的字节,因此varchar会更节省空间一点
总结:char修改效率高,但是会浪费一部分空间;varchar节省空间,但是修改效率较低
char适用的场景:
- 长度固定的列,例如手机号码、身份证号码、MD5密文数据
varchar适用的场景:
- 字符串最大长度远大于该列的平均长度
- 修改的场景不频繁
- 使用了UTF-8这种复杂的字符集,每个字符都使用不同的字节数进行存储
二 数字类型
MySql中以数据类型(m)来约束数据
在数字类型中,取值范围都已经被确定,并且所占用的内存大小都已确定是固定值(decimal除外)
在整型中这个m表示的意义是:假如指定了这个m为5,那么长度不足5的数字存进去可以在左侧被某个字符填充,例如采用zerofill放进去一个1,那么最终就是00001,如果长度超过了5,那就什么都不做;如果没有指定zerofill,m没有用处
小数分为浮点数和定点数:浮点数是float和double,定点数是double,都可以使用(m,d)来表示
其中,m表示总的位数,d表示小数位
浮点数中,d不可以大于m;decimal的取值范围和占用内存大小都随m变化,暂用内存大小为m+2个字节
可参考:https://www.jianshu.com/p/73b60e15b842
三 时间类型
- date:YYYY-MM-DD
- time:HH:MM:SS
- year:YYYY
- datetime:日期和时间,YYYY-MM-DD HH:MM:SS
- timestamp:时间戳,YYYY-MM-DD HH:MM:SS[.fraction],例如:2018-01-09 10:44:00.00000
对于date字段来说,它只支持date部分,如果插入了time部分的内容,它会丢弃掉该部分的内容,并提示一个warning;例如往一个date类型字段插入20180109104400,则会保存为2018-1-09,并提示一个warn