0

0

MySQL如何运用NUMBER_MySQL数值类型使用与计算教程

雪夜

雪夜

发布时间:2025-09-01 08:28:01

|

228人浏览过

|

来源于php中文网

原创

答案:MySQL数值类型分整数、定点数、浮点数三类。整数类型如TINYINT到BIGINT,根据数据范围和存储效率选择,推荐用UNSIGNED扩大正数范围;DECIMAL用于精确计算,如货币,保证精度但占用空间较大;FLOAT和DOUBLE用于近似计算,适用于科学测量,但存在精度误差,需避免直接比较或累积运算。合理选择类型可提升性能与准确性。

mysql如何运用number_mysql数值类型使用与计算教程

MySQL中的数值类型,是数据库存储和处理数字数据的基石。它不仅仅是简单地把数字存进去,更关乎数据精度、存储效率以及后续计算的准确性。理解并正确运用这些类型,能让我们在数据库设计和应用开发中少走很多弯路,避免那些看似微小却可能导致严重后果的精度问题。说白了,就是选对工具干对的活。

解决方案

在MySQL里,数值类型大致可以分为三类:整数类型、定点数类型和浮点数类型。每种类型都有其独特的存储机制、范围和精度特性,这决定了它们各自的最佳应用场景。

1. 整数类型 (Integer Types): 包括

TINYINT
,
SMALLINT
,
MEDIUMINT
,
INT
,
BIGINT
。它们用于存储没有小数部分的数字。关键在于选择能容纳你数据范围的最小类型,以节省存储空间。

  • TINYINT
    : 范围很小,适合存储布尔值(0/1)或小范围枚举值(比如年龄,但别超过127或255)。
  • SMALLINT
    : 比TINYINT大一点,比如可以存省份ID。
  • MEDIUMINT
    : 不常用,但比SMALLINT大。
  • INT
    : 最常用,默认整数类型,足够存储大部分常规ID或计数。
  • BIGINT
    : 存储非常大的整数,比如用户量庞大的系统ID、或一些天文数字。

所有整数类型都可以加上

UNSIGNED
关键字,表示只存储非负数,这样可以扩大正数的存储范围,因为负数部分的空间被“挪用”了。例如,
TINYINT
默认范围是 -128到127,而
TINYINT UNSIGNED
则是 0到255。

2. 定点数类型 (Fixed-Point Type): 主要是

DECIMAL
(或
NUMERIC
)。这是处理货币、精确计算(比如库存数量、税率)时的首选。它的特点是精确存储,不会有浮点数那样的精度问题。

  • DECIMAL(M, D)
    :
    M
    是总位数(精度),
    D
    是小数位数(标度)。例如
    DECIMAL(10, 2)
    可以存储总共10位数字,其中2位是小数,范围从 -99999999.99 到 99999999.99。MySQL会用二进制编码十进制(BCD)来存储,保证精度。

3. 浮点数类型 (Floating-Point Types): 包括

FLOAT
DOUBLE
。它们用于存储带有小数的数字,但其存储方式决定了它们是近似值,不适合需要精确计算的场景。

  • FLOAT
    : 单精度浮点数,存储空间较小,精度有限(大约7位有效数字)。
  • DOUBLE
    : 双精度浮点数,存储空间较大,精度更高(大约15位有效数字)。
  • 这两种类型在科学计算、测量数据(比如地理坐标,但也要注意精度要求)中比较常见。

在计算方面,MySQL支持标准的算术运算符

+
,
-
,
*
,
/
。还有取模
MOD
%
,以及整除
DIV
。当不同类型的数值进行计算时,MySQL会进行隐式类型转换,通常会向精度更高的类型转换,以避免数据丢失。如果需要强制转换,可以使用
CAST(value AS type)
CONVERT(value, type)

在MySQL中,我该如何选择合适的整数类型来存储数据?

选择合适的整数类型,远不止“能存下就行”那么简单。它涉及到存储效率、查询性能,甚至未来的扩展性。在我看来,这更像是一种权衡的艺术。

我们最常见的场景是存储ID。比如用户ID,订单ID。如果你的系统用户量预计不会超过20亿,那么

INT
类型通常是安全且高效的选择。
INT
的范围是大约正负21亿,对于绝大多数中小型乃至大型应用都足够了。但如果你在做一个全球性的、用户基数可能达到百亿甚至千亿级别的平台,或者某些业务数据(比如日志ID、消息队列ID)增长极快,那么
BIGINT
就成了不可避免的选择。虽然
BIGINT
占用8字节,是
INT
的两倍,但为了数据的完整性和未来的可扩展性,这点存储空间的牺牲是值得的。

再看一些小范围的场景。比如存储一个状态码(0代表待处理,1代表成功,2代表失败),或者一个表示性别的字段(0男1女),

TINYINT
是最经济的选择。它只占用1个字节,比
INT
的4个字节节省了大量空间。想象一下,一个千万级用户表,如果性别字段都用
INT
,那将是额外30MB的存储浪费,这在数据量庞大时,会影响到I/O性能。

对于年龄这种通常不会超过120的数值,

TINYINT UNSIGNED
也是个不错的选择,范围0-255,完全覆盖。使用
UNSIGNED
的好处是,在确保数据不会出现负数的情况下,能将正数范围扩大一倍,这在某些计数场景下很有用。比如一个商品的库存,你肯定不希望它是负数,
SMALLINT UNSIGNED
就能存储0到65535的库存量。

当然,也要避免过度优化。如果一个字段你实在拿不准未来会不会超出

INT
的范围,或者这个表的数据量不大,比如只有几百行,那么直接用
INT
通常不会带来明显的性能问题,而且可以减少后期修改数据类型的麻烦。但对于核心表、大表,精打细算地选择数据类型,是数据库设计者必须具备的素养。

-- 示例:不同整数类型的应用
CREATE TABLE user_profiles (
    user_id BIGINT PRIMARY KEY AUTO_INCREMENT, -- 用户ID,考虑未来扩展性
    age TINYINT UNSIGNED,                      -- 年龄,非负且范围小
    gender TINYINT(1),                         -- 性别,0/1,TINYINT(1)只是显示宽度提示,实际仍是TINYINT
    status SMALLINT,                           -- 用户状态码,可能不止0/1/2,所以用SMALLINT
    login_count INT                            -- 登录次数,可能会很大
);

-- 插入数据
INSERT INTO user_profiles (age, gender, status, login_count) VALUES (30, 1, 10, 1500);

处理货币或精确小数时,MySQL的DECIMAL类型有哪些独特优势和注意事项?

当涉及到金钱交易、库存管理、税率计算这类对精度要求极高的场景时,

DECIMAL
类型无疑是MySQL提供的最佳解决方案。它的独特优势在于能够提供精确的十进制存储和计算,彻底避免了浮点数固有的精度问题。

PHP高级开发技巧与范例
PHP高级开发技巧与范例

PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书

下载

你知道吗,计算机内部存储浮点数(

FLOAT
DOUBLE
)时,使用的是二进制近似表示法。这就导致了一些看似简单的十进制小数,比如0.1,在二进制中是无法精确表示的,就像1/3在十进制中是0.333...无限循环一样。因此,
0.1 + 0.2
这样的运算结果,在浮点数世界里可能就不是精确的
0.3
,而是
0.30000000000000004
这样的值。在金融领域,哪怕是最小的误差累积起来,都可能造成巨大的损失。

DECIMAL(M, D)
的设计就是为了解决这个问题。
M
代表总共的有效数字位数(包括整数部分和小数部分),
D
代表小数部分的位数。比如,一个
DECIMAL(10, 2)
的字段,它可以存储从 -99,999,999.99 到 99,999,999.99 的数值,并且保证小数部分的两位是绝对精确的。MySQL在内部会用一种高效的方式(通常是二进制编码十进制,BCD)来存储这些数字,确保每个十进制位都能被准确地表示。

独特优势:

  1. 绝对精度: 这是最重要的优势。它保证了数值的精确性,特别适用于财务、会计、科学计量等对精度要求极高的领域。
  2. 可控的范围和精度: 通过
    M
    D
    参数,你可以精确控制数值的存储范围和小数位数,确保数据符合业务规则。

注意事项:

  1. 存储空间:
    DECIMAL
    类型相比整数和浮点数,通常会占用更多的存储空间。因为要保证精确性,它需要为每个十进制位分配存储空间。例如,
    DECIMAL(20, 10)
    可能需要9个字节,而
    DOUBLE
    只需要8个字节。不过,在精度面前,这点存储空间的牺牲通常是值得的。
  2. 性能:
    DECIMAL
    类型的计算可能会比
    FLOAT
    DOUBLE
    略慢,因为涉及到更复杂的十进制算术逻辑,而不是简单的二进制浮点运算。但在大多数业务场景中,这种性能差异微乎其微,不足以成为放弃精度的理由。
  3. 合理设置
    M
    D
    如果
    M
    D
    设置得过小,可能导致数据溢出或精度截断。例如,如果你定义
    DECIMAL(5, 2)
    来存储价格,但插入
    1234.56
    ,就会因为整数部分超出3位而报错。反之,如果设置过大,则会浪费存储空间。因此,需要根据业务需求,仔细评估数值的最大可能范围和小数精度。
-- 示例:DECIMAL类型的应用
CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(255),
    price DECIMAL(10, 2), -- 商品价格,精确到分
    tax_rate DECIMAL(5, 4), -- 税率,精确到万分位,如0.0650
    stock_quantity DECIMAL(12, 3) -- 库存量,可能需要小数,如液体、散装物料
);

-- 插入数据
INSERT INTO products (product_name, price, tax_rate, stock_quantity)
VALUES ('牛奶', 12.99, 0.0650, 100.500);

-- 尝试浮点数计算的精度问题
SELECT 0.1 + 0.2; -- 结果是0.3
SELECT CAST(0.1 AS FLOAT) + CAST(0.2 AS FLOAT); -- 结果可能是0.300000004
SELECT CAST(0.1 AS DECIMAL(2,1)) + CAST(0.2 AS DECIMAL(2,1)); -- 结果是0.3

MySQL中的浮点数类型(FLOAT与DOUBLE)在科学计算中如何应用,又有哪些精度陷阱?

FLOAT
DOUBLE
这两种浮点数类型,在MySQL中主要用于存储和处理那些允许有一定误差的近似数值。它们在科学计算、工程测量、地理坐标(如经纬度)等领域有着广泛的应用,因为这些场景往往数据量大,对计算速度有一定要求,而对绝对精度则可以接受一定范围内的误差。

应用场景:

  1. 科学实验数据: 比如传感器采集的温度、压力、湿度等,这些数据本身就带有测量误差,使用浮点数存储是合理的。
  2. 物理模拟与计算: 涉及到大量迭代计算的物理模型,浮点数运算速度快,可以提高效率。
  3. 地理信息系统 (GIS): 存储经纬度信息,通常使用
    DOUBLE
    以保证足够的精度,但也要明白这仍然是近似值。例如,地球周长很大,即便是
    DOUBLE
    ,在极高精度的地图应用中也可能显现出微小误差。
  4. 统计分析: 处理平均值、标准差等统计指标时,浮点数是常见的选择。

精度陷阱: 浮点数最大的“坑”就在于其固有的精度不确定性。这并不是MySQL的问题,而是IEEE 754浮点数标准所决定的。计算机用二进制来近似表示小数,导致许多十进制小数无法精确表示,只能无限接近。

  1. 比较运算的风险: 永远不要直接使用
    =
    来比较两个浮点数是否相等。比如
    SELECT (0.1 + 0.2) = 0.3;
    在某些情况下可能会返回
    FALSE
    ,因为
    0.1 + 0.2
    的内部表示可能略微偏离
    0.3
    。正确的做法是比较它们的差值是否在一个极小的范围内(epsilon值),例如
    ABS((0.1 + 0.2) - 0.3) < 0.0000001
  2. 累积误差: 在进行大量浮点数运算时,微小的近似误差会不断累积,最终可能导致结果与预期相去甚远。这在复杂的科学模型中尤其需要警惕。
  3. 数据截断:
    FLOAT
    提供大约7位有效数字的精度,
    DOUBLE
    提供大约15位。如果你的数据精度要求超过了这些限制,就会发生截断。例如,一个需要20位小数的科学常数,用
    DOUBLE
    存储后,后面的位数就会丢失。

在实际操作中,如果非要用浮点数,但又需要尽量减少误差,可以考虑以下策略:

  • 尽可能使用
    DOUBLE
    而非
    FLOAT
    ,因为
    DOUBLE
    精度更高。
  • 在进行关键计算时,如果可能,将浮点数转换为
    DECIMAL
    进行运算,或者在应用程序层面使用支持高精度计算的库。
  • 对结果进行四舍五入,以消除微小的误差,但要注意四舍五入的时机和方式。

说到底,浮点数就像一把双刃剑:它提供了高性能和对大范围数值的支持,但代价是牺牲了绝对精度。所以,在选择使用

FLOAT
DOUBLE
之前,务必清楚你的数据对精度的要求,以及潜在的风险。

-- 示例:浮点数类型及精度问题
CREATE TABLE sensor_data (
    reading_id INT PRIMARY KEY AUTO_INCREMENT,
    latitude DOUBLE,    -- 经度
    longitude DOUBLE,   -- 纬度
    temperature FLOAT,  -- 温度,允许一定误差
    pressure DOUBLE     -- 压力,需要更高精度
);

-- 插入数据
INSERT INTO sensor_data (latitude, longitude, temperature, pressure)
VALUES (34.0522, -118.2437, 25.5, 1013.25);

-- 浮点数比较陷阱
SELECT (0.1 + 0.2) = 0.3 AS direct_comparison; -- 可能会是0或FALSE
SELECT ABS((0.1 + 0.2) - 0.3) < 0.0000001 AS epsilon_comparison; -- 这种方式更安全

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

663

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

529

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 3.5万人学习

Node.js 教程
Node.js 教程

共57课时 | 8.8万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号