Mysql 简明教程
MySQL - DECIMAL
The MySQL Decimal Data Type
MySQL DECIMAL 数据类型用于存储带有小数点的数值。它允许进行精确的计算,可以配置为在小数点前后存储指定数量的数位。
我们经常将此数据类型用于需要精确精度的列,例如雇员的工资、雇员公积金余额等。
Syntax
以下是在定义一个数据类型为 DECIMAL 的列的语法:
column_name DECIMAL(P,D);
其中,
-
P 称为精度,它指定可以在列中存储的有效数字的总数,它们在小数点左右两侧。P 的范围是 1 到 65。
-
D 是刻度,它指定小数点后可以存储的最大数字数。D 的范围应在 0 到 30 之间,且 D 小于或等于 (⇐) P。
例如,如果我们定义一个列为 DECIMAL(10,2),它最多可以存储 10 位数的数字,最多可有 2 位数字位于小数点右侧。
Attributes
DECIMAL 关键字有两个属性: UNSIGNED 和 ZEROFILL 。
-
UNSIGNED − 当使用时,它表示该列不接受负值。
-
ZEROFILL − 如果使用,它将用零填充数字以达到指定的宽度。
Precision and Scale
在以下查询中,我们定义了一个名为 SALARY 的列,其数据类型为 DECIMAL,指定精度为 5,刻度为 3:
SALARY decimal(5,3)
此定义意味着 SALARY 列可以存储值,该值最多为 5 位数,包括小数点右边的 3 位数。此列的范围为 99.999 到 -99.999。
MySQL DECIMAL Storage
MySQL 使用可以优化存储的二进制格式来存储“DECIMAL”数据类型的值。具体而言,MySQL 将 9 个数字打包到 4 个字节中。整型部分和小数部分分开分配存储,每组 9 个数字使用 4 个字节。任何剩余数字都需要额外的存储空间。
剩余(剩余)数字所需的存储空间在以下表中演示:
考虑一个 DECIMAL(30,9) 列,它对小数部分有 9 位数字,对整数部分有 30 - 9 = 21 位数字。在这种情况下,小数部分占据 4 个字节。整数部分前 18 位数字占用 8 个字节,而对于剩余的 3 位数字,它需要额外的 2 个字节。因此, DECIMAL(30,9) 列总共需要 14 个字节。
Example
为了进一步理解这一点,让我们使用以下查询创建一个名为 EMPLOYEES 的表 -
CREATE TABLE EMPLOYEES (
ID int NOT NULL AUTO_INCREMENT,
NAME varchar(30) NOT NULL,
SALARY decimal(14,4) NOT NULL,
PRIMARY KEY (ID)
);
使用以下查询,我们正在向上面创建的表中插入一些记录 -
INSERT INTO EMPLOYEES (NAME, SALARY) VALUES
("Krishna", 150050.34),
("Kalyan", 100000.65);
得到的 EMPLOYEES 表如下 -
使用以下查询,我们正在在“SALARY”列中包含 ZEROFILL 属性 -
ALTER TABLE EMPLOYEES
MODIFY SALARY decimal(14, 4) zerofill;
以下是以上查询的输出:
Query OK, 2 rows affected, 1 warning (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 1
在这里,我们正在尝试在 SALARY 列中包括 ZEROFILL 属性之后,从 EMPLOYEES 表中获取所有记录 -
SELECT * FROM EMPLOYEES;
记录将显示基于“SALARY”列中指定范围填充的零 -