当数据带有小数部分时,就需要使用浮点数类型或定点数类型。它们都能表示小数,但底层存储方式和精度表现并不相同。
MySQL 中常见的这类类型有:
FLOATDOUBLEDECIMALFLOAT 是单精度浮点数,适合对精度要求不高、但更关注存储空间和速度的场景。
常见场景:
示例:
CREATE TABLE weather (
id int NOT NULL AUTO_INCREMENT,
temperature float DEFAULT NULL,
PRIMARY KEY (id)
);
需要注意,FLOAT 在计算和存储时可能出现精度误差,因此不适合保存金额等精确数据。
DOUBLE 是双精度浮点数,精度和范围都比 FLOAT 更高。
常见场景:
示例:
CREATE TABLE position_log (
id int NOT NULL AUTO_INCREMENT,
longitude double NOT NULL,
latitude double NOT NULL,
PRIMARY KEY (id)
);
DOUBLE 比 FLOAT 更精确,但本质上仍然是浮点数,也可能存在精度问题。
DECIMAL 是定点数类型,适合要求精确计算的场景。
最典型的场景就是:
语法通常写为:
DECIMAL(M, D)
其中:
M 表示总位数D 表示小数位数例如:
CREATE TABLE account (
id int NOT NULL AUTO_INCREMENT,
balance decimal(10,2) NOT NULL DEFAULT 0.00,
PRIMARY KEY (id)
);
这里的 decimal(10,2) 表示总共 10 位,其中 2 位是小数位,也就是最多能表示 8 位整数加 2 位小数。
选择规则可以概括为:
DECIMALFLOATDOUBLE例如:
DECIMAL(10,2)DOUBLEFLOATFLOAT 和 DOUBLE 是近似值,DECIMAL 是精确值。只要涉及金额、结算、财务、积分等不能容忍误差的业务,应该优先使用 DECIMAL。