Mysql 简明教程

MySQL - DECIMAL

The MySQL Decimal Data Type

MySQL DECIMAL 数据类型用于存储带有小数点的数值。它允许进行精确的计算,可以配置为在小数点前后存储指定数量的数位。

我们经常将此数据类型用于需要精确精度的列,例如雇员的工资、雇员公积金余额等。

Syntax

以下是在定义一个数据类型为 DECIMAL 的列的语法:

column_name  DECIMAL(P,D);

其中,

  1. P 称为精度,它指定可以在列中存储的有效数字的总数,它们在小数点左右两侧。P 的范围是 1 到 65。

  2. D 是刻度,它指定小数点后可以存储的最大数字数。D 的范围应在 0 到 30 之间,且 D 小于或等于 (⇐) P。

例如,如果我们定义一个列为 DECIMAL(10,2),它最多可以存储 10 位数的数字,最多可有 2 位数字位于小数点右侧。

Attributes

DECIMAL 关键字有两个属性: UNSIGNEDZEROFILL

  1. UNSIGNED − 当使用时,它表示该列不接受负值。

  2. ZEROFILL − 如果使用,它将用零填充数字以达到指定的宽度。

Precision and Scale

在以下查询中,我们定义了一个名为 SALARY 的列,其数据类型为 DECIMAL,指定精度为 5,刻度为 3:

SALARY decimal(5,3)

此定义意味着 SALARY 列可以存储值,该值最多为 5 位数,包括小数点右边的 3 位数。此列的范围为 99.999 到 -99.999。

No Decimal Places

在此处,SALARY 列不包含小数部分或小数点。以下两个查询相同 -

SALARY DECIMAL(5);
SALARY DECIMAL(5,0);

这两个声明都表明 SALARY 列可以存储没有小数点的整数值。

Default Precision

如果您省略精度值,则默认精度 P 将为 10 -

SALARY DECIMAL;

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”列中指定范围填充的零 -

Decimal Datatype Using a Client Program

我们还可以使用客户端程序创建小数数据类型列。

Syntax

Example

以下是这些程序 −