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

MySQL中的数值类型,是数据库存储和处理数字数据的基石。它不仅仅是简单地把数字存进去,更关乎数据精度、存储效率以及后续计算的准确性。理解并正确运用这些类型,能让我们在数据库设计和应用开发中少走很多弯路,避免那些看似微小却可能导致严重后果的精度问题。说白了,就是选对工具干对的活。
在MySQL里,数值类型大致可以分为三类:整数类型、定点数类型和浮点数类型。每种类型都有其独特的存储机制、范围和精度特性,这决定了它们各自的最佳应用场景。
1. 整数类型 (Integer Types): 包括
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
所有整数类型都可以加上
UNSIGNED
TINYINT
TINYINT UNSIGNED
2. 定点数类型 (Fixed-Point Type): 主要是
DECIMAL
NUMERIC
DECIMAL(M, D)
M
D
DECIMAL(10, 2)
3. 浮点数类型 (Floating-Point Types): 包括
FLOAT
DOUBLE
FLOAT
DOUBLE
在计算方面,MySQL支持标准的算术运算符
+
-
*
/
MOD
%
DIV
CAST(value AS type)
CONVERT(value, type)
选择合适的整数类型,远不止“能存下就行”那么简单。它涉及到存储效率、查询性能,甚至未来的扩展性。在我看来,这更像是一种权衡的艺术。
我们最常见的场景是存储ID。比如用户ID,订单ID。如果你的系统用户量预计不会超过20亿,那么
INT
INT
BIGINT
BIGINT
INT
再看一些小范围的场景。比如存储一个状态码(0代表待处理,1代表成功,2代表失败),或者一个表示性别的字段(0男1女),
TINYINT
INT
INT
对于年龄这种通常不会超过120的数值,
TINYINT UNSIGNED
UNSIGNED
SMALLINT UNSIGNED
当然,也要避免过度优化。如果一个字段你实在拿不准未来会不会超出
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);当涉及到金钱交易、库存管理、税率计算这类对精度要求极高的场景时,
DECIMAL
PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书
472
你知道吗,计算机内部存储浮点数(
FLOAT
DOUBLE
0.1 + 0.2
0.3
0.30000000000000004
DECIMAL(M, D)
M
D
DECIMAL(10, 2)
独特优势:
M
D
注意事项:
DECIMAL
DECIMAL(20, 10)
DOUBLE
DECIMAL
FLOAT
DOUBLE
M
D
M
D
DECIMAL(5, 2)
1234.56
-- 示例: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.3FLOAT
DOUBLE
应用场景:
DOUBLE
DOUBLE
精度陷阱: 浮点数最大的“坑”就在于其固有的精度不确定性。这并不是MySQL的问题,而是IEEE 754浮点数标准所决定的。计算机用二进制来近似表示小数,导致许多十进制小数无法精确表示,只能无限接近。
=
SELECT (0.1 + 0.2) = 0.3;
FALSE
0.1 + 0.2
0.3
ABS((0.1 + 0.2) - 0.3) < 0.0000001
FLOAT
DOUBLE
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如何运用NUMBER_MySQL数值类型使用与计算教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号