MySQL - 数据类型
# 数据类型
合理定义数据类型,可以节省存储空间,提升数据查询和处理的速度。
评估字段使用何种类型,需要考虑存储空间和可靠性的平衡问题,使用占用字节少的类型,虽然可以节省存储空间,但前提是确保实际数据不会超过其取值范围。系统故障的成本远高于多占用存储空间的成本。
# 整数类型
# 
# 浮点数类型
问题:为什么浮点数类型的无符号数取值范围,只相当于有符号数取值范围的一半,也就是只相当于有符号数取值范围大于等于零的部分呢?
原因是:MySQL 是按照这个格式存储浮点数的:符号(S)、尾数(M)和阶码(E)。因此,无论有没有符号,MySQL 的浮点数都会存储表示符号的部分。因此,所谓的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。
问题:浮点类型为什么不精确
原因是:MySQL 的浮点数类型采用二进制的方式存储十进制数据,比如 9.625 采用二进制来表达就是 1001.101 或者 1.001101 * 2 ^ 3。而如果数据的尾数不是 0 或 5 就无法使用二进制精确表达,而 MySQL 的做法是在允许取值的范围内进行四舍五入。而双精度类型 Double 有 8 个字节,其取值范围比单精度类型 Float 大,所以更加精确。
浮点数类型适用于可容忍微小误差的科学计算。
# 定点数类型
MySQL 定点数类型是精确的,其将十进制数的整数和小数部分拆分开,分别使用十六进制数进行存储。用 DECIMAL(M, D)的方式表示高精度小数。其中,M 表示整数部分加小数部分,一共有多少位,M<=65。D 表示小数部分位数(即精度)。
取值范围:如果 M> D,为 M+2 否则为 D+2
定点数类型适用于高精度场景,如金额
# 字符串类型
- CHAR(M):固定长度字符串。CHAR(M) 类型必须预先定义字符串长度。如果太短,数据可能会超出范围;如果太长,又浪费存储空间。
- VARCHAR(M): 可变长度字符串。VARCHAR(M) 也需要预先知道字符串的最大长度,不过只要不超过这个最大长度,具体存储的时候,是按照实际字符串长度存储的。
- TEXT:字符串。系统自动按照实际长度存储,不需要预先定义长度。
- ENUM: 枚举类型,取值必须是预先设定的一组字符串值范围之内的一个,必须要知道字符串所有可能的取值。
- SET:是一个字符串对象,取值必须是在预先设定的字符串值范围之内的 0 个或多个,也必须知道字符串所有可能的取值。
# 日期和时间类型
小建议:为了确保数据的完整性和系统的稳定性,优先考虑使用 DATETIME 类型。因为虽然 DATETIME 类型占用的存储空间最多,但是它表达的时间最为完整,取值范围也最大。若系统有多语言需求,可考虑将日期时间存储为时间戳(整数型),在应用层进行转换。