Float、Decimal 存储金额的区别?
MySQL中存在 float, double 等非标准数据类型, 也有 decimal 这种标准数据类型
其区别在于: float, double等非标准类型在DB中保存的是近似值, 而Decimal则以字符串的形式保存数值.
float和double 数据的精确度取决于分配给每种数据类型的存储长度, 其中float分配了4字节, 而double分配了8字节, 采用float和double本来就是不准的
decimal类型是MySQL官方唯一指定能精确存储的类型, 和金钱相关的类型都要存储为decimal
Datetime、Timestamp 存储时间的区别?
Datetime
- 保存格式为YYYYMMDDHHMMSS(年月日时分秒)的整数, 与时区无关, 存入的是什么值就是什么值, 不会根据当前时区进行转换
- mysql 5.6.4之后可以存储小数片段, 最多到小数点后6位
- mysql 5.6.4之前没有小数片段, 精确到秒. 新数据不兼容旧数据(无法往回导入)
- 存储范围从0000-00-00 00:00:00 到'9999-12-31 23:59:59'
- 长度8个字节, datetime(n), n是显示的小数位数, 即使小数位数是0存储也是6位小数, 仅仅显示0位而已
- 显示时, 显示日期和时间
Timestamp
- 存入的是自1970-01-01午夜(格林尼治标准时间)以来的毫秒数, 和unix时间戳相同. 与时区有关, 查询时转为相应的时区时间.
- it stores the number of milliseconds
- 存储范围'1970-01-01 00:00:01'?UTC to?'2038-01-19 03:14:07'?
- 默认值为CURRENT_TIMESTAMP(), 其实也就是当前的系统时间, 这一列只能由系统自动更新, 不能由sql更新, timestamp类型适合用来记录数据的最后修改时间, 因为只要你更改了记录中其他字段的值, timestamp字段的值都会被自动更新
- 长度4字节, 因为存储长度的原因, 决定了它支持的范围的比datetime的要小
CHAR, VARCHAR, BINARY, VARBINARY 存储字符的区别?
CHAR
CHAR(N) 用来存储非二进制字符串, 插入少于N个字符的会自动在尾部加空格, 查询时, 尾部的空格就会被丢弃掉(客户端可以忽略这个, 当作存入和取出的一致就行). CHAR 使用固定长度的空间进行存储, CHAR(4)存储4个字符, 根据编码方式的不同占用不同的字节, GBK 编码不论是中文还是英文, 每个字符占用2个字节, UTF8编码每个字符占用3个字节.
VARCHAR
VARCHAR(N) 用来存储非二进制字符串, 插入少于N个字符的不填补空格, 查询时, 尾部的空格不会被丢弃掉
BINARY
BINARY(N)存储二进制字符串, 插入少于N个字节的会自动在尾部加0x00, 取出时, 所有的字节都保留, 返回定义长度的字节长度, 在比较的时候, 所有的字节都是有效的, 并且0x00 小于 space (space对应的是0x20)