1. 首页 > MySQL教程 > 正文

MySQL教程FG066-MySQL数值类型详解

GF-MySQL

内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。

Part01-基础概念与理论知识

1.1 什么是数值类型

数值类型是MySQL中用于存储数字数据的数据类型。MySQL提供了多种数值类型,包括整数、浮点数和定点数,以满足不同的存储需求。

1.2 数值类型的分类

  • 整数类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
  • 浮点数类型:FLOAT, DOUBLE
  • 定点数类型:DECIMAL

Part02-生产环境规划与建议

2.1 整数类型的特性

类型 存储空间 有符号范围 无符号范围 描述
TINYINT 1字节 -128 到 127 0 到 255 非常小的整数
SMALLINT 2字节 -32768 到 32767 0 到 65535 小整数
MEDIUMINT 3字节 -8388608 到 8388607 0 到 16777215 中等大小整数
INT 4字节 -2147483648 到 2147483647 0 到 4294967295 标准整数
BIGINT 8字节 -9223372036854775808 到 9223372036854775807 0 到 18446744073709551615 大整数

2.2 整数类型的使用

示例: 01 更多视频教程www.fgedu.net.cn

-- 创建包含各种整数类型的表
CREATE TABLE integer_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tiny_col TINYINT,
    small_col SMALLINT,
    medium_col MEDIUMINT,
    int_col INT,
    big_col BIGINT,
    tiny_unsigned TINYINT UNSIGNED,
    small_unsigned SMALLINT UNSIGNED,
    medium_unsigned MEDIUMINT UNSIGNED,
    int_unsigned INT UNSIGNED,
    big_unsigned BIGINT UNSIGNED
);

-- 插入数据
INSERT INTO integer_test (
    tiny_col, small_col, medium_col, int_col, big_col,
    tiny_unsigned, small_unsigned, medium_unsigned, int_unsigned, big_unsigned
) VALUES (
    127, 32767, 8388607, 2147483647, 9223372036854775807,
    255, 65535, 16777215, 4294967295, 18446744073709551615
);

-- 查询数据
SELECT * FROM integer_test;
            

2.3 整数类型的选择

  • TINYINT:适用于存储范围很小的整数,如年龄、性别等
  • SMALLINT:适用于存储较小的整数,如评分、数量等
  • MEDIUMINT:适用于存储中等大小的整数,如ID、数量等
  • INT:适用于大多数整数存储需求,如用户ID、订单ID等
  • BIGINT:适用于存储大整数,如雪花ID、大数量等

Part03-生产环境项目实施方案

3.1 浮点数类型的特性

类型 存储空间 精度 取值范围 描述
FLOAT 4字节 单精度,约7位小数 ±1.175494351E-38 到 ±3.402823466E+38 单精度浮点数
DOUBLE 8字节 双精度,约15位小数 ±2.2250738585072014E-308 到 ±1.7976931348623157E+308 双精度浮点数

3.2 浮点数类型的使用

示例:

-- 创建包含浮点数类型的表
CREATE TABLE float_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    float_col FLOAT,
    double_col DOUBLE,
    float_precise FLOAT(10,2),
    double_precise DOUBLE(10,2)
);

-- 插入数据
INSERT INTO float_test (float_col, double_col, float_precise, double_precise) 
VALUES (123.45, 123.45, 1234567.89, 1234567.89);

-- 查询数据
SELECT * FROM float_test;

-- 测试精度
SELECT 
    float_col, 
    double_col, 
    float_precise, 
    double_precise,
    float_col + 0.0000001 AS float_add,
    double_col + 0.0000000000001 AS double_add
FROM float_test;
            

3.3 浮点数的精度问题

浮点数在存储时会存在精度损失的问题,这是因为浮点数是通过二进制表示的,无法精确表示所有十进制小数。

示例:浮点数精度问题

-- 测试浮点数精度
SELECT 0.1 + 0.2; -- 结果可能不是0.3
SELECT CAST(0.1 + 0.2 AS DECIMAL(10,1)); -- 结果可能是0.3
            

Part04-生产案例与实战讲解

4.1 定点数类型的特性

类型 存储空间 精度 描述
DECIMAL(M,D) 可变 精确,M位总位数,D位小数 定点数,用于精确存储小数

4.2 定点数类型的使用

示例:

-- 创建包含定点数类型的表
CREATE TABLE decimal_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    price DECIMAL(10,2), -- 价格,精确到分
    tax DECIMAL(8,4), -- 税率,精确到小数点后4位
    total DECIMAL(12,2) -- 总计,精确到分
);

-- 插入数据
INSERT INTO decimal_test (price, tax, total) 
VALUES (199.99, 0.0825, 216.49);

-- 查询数据
SELECT * FROM decimal_test;

-- 测试精度
SELECT price + tax, CAST(price * (1 + tax) AS DECIMAL(12,2)) FROM decimal_test;
            

4.3 定点数与浮点数的比较

  • 精度:定点数精度更高,适合存储货币等需要精确计算的数据
  • 存储空间:定点数存储空间更大
  • 计算速度:浮点数计算速度更快
  • 使用场景
    • 定点数:货币、税率、百分比等需要精确计算的场景
    • 浮点数:科学计算、工程计算等对精度要求不高的场景

Part05-风哥经验总结与分享

5.1 UNSIGNED属性

UNSIGNED属性用于指定数值类型为无符号,即只存储非负数值。

示例: 02 学习交流加群风哥微信: itpux-com

-- 创建无符号整数列
CREATE TABLE unsigned_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    positive_num INT UNSIGNED, -- 只存储非负整数
    age TINYINT UNSIGNED, -- 年龄,非负
    count SMALLINT UNSIGNED -- 计数,非负
);

-- 插入数据
INSERT INTO unsigned_test (positive_num, age, count) VALUES (100, 25, 5);

-- 尝试插入负数(会报错)
-- INSERT INTO unsigned_test (positive_num, age, count) VALUES (-1, 25, 5);
            

5.2 ZEROFILL属性

ZEROFILL属性用于在数值前面填充零,使数值达到指定的宽度。

示例:

-- 创建带ZEROFILL属性的列
CREATE TABLE zerofill_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code INT(5) ZEROFILL, -- 5位宽度,不足前面补零
    number INT(10) ZEROFILL -- 10位宽度,不足前面补零
);

-- 插入数据
INSERT INTO zerofill_test (code, number) VALUES (123, 456);

-- 查询数据
SELECT * FROM zerofill_test;
-- 结果:code显示为00123,number显示为0000000456
            

5.3 AUTO_INCREMENT属性

AUTO_INCREMENT属性用于自动生成递增的数值,通常用于主键列。

示例:

-- 创建带AUTO_INCREMENT属性的列
CREATE TABLE auto_increment_test (
    id INT AUTO_INCREMENT PRIMARY KEY, -- 自动递增
    name VARCHAR(50)
);

-- 插入数据
INSERT INTO auto_increment_test (name) VALUES ('Test 1');
INSERT INTO auto_increment_test (name) VALUES ('Test 2');
INSERT INTO auto_increment_test (name) VALUES ('Test 3');

-- 查询数据
SELECT * FROM auto_increment_test;
-- 结果:id会自动生成1, 2, 3
            

6. 数值类型的最佳实践

6.1 整数类型的最佳实践

  • 根据数据范围选择合适的整数类型
  • 对于非负数值,使用UNSIGNED属性
  • 对于需要自动生成的ID,使用AUTO_INCREMENT
  • 避免使用过大的整数类型,浪费存储空间

6.2 浮点数类型的最佳实践

  • 对于需要精确计算的数据,避免使用浮点数
  • 对于科学计算等对精度要求不高的场景,使用浮点数
  • 指定合适的精度,如FLOAT(10,2)

6.3 定点数类型的最佳实践

  • 对于货币、税率等需要精确计算的数据,使用DECIMAL
  • 根据实际需求指定合适的精度,如DECIMAL(10,2)用于价格
  • 注意DECIMAL的存储空间,避免过度指定精度

7. 常见错误与解决方案

7.1 整数溢出

问题:插入的数值超过了整数类型的范围

解决方案:选择更大的整数类型,或使用UNSIGNED属性

7.2 浮点数精度丢失

问题:浮点数计算结果与预期不符 03 学习交流加群风哥QQ113257174

解决方案:对于需要精确计算的场景,使用DECIMAL类型

7.3 存储空间浪费

问题:使用了过大的数值类型 04 风哥提示:

解决方案:根据实际数据范围选择合适的数值类型

7.4 索引效率问题

问题:对大数值类型创建索引影响性能

解决方案:对于大数值类型,考虑使用合适的索引策略

8. 示例:综合使用数值类型

示例:订单表设计

CREATE TABLE orders (
    order_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 订单ID,使用BIGINT支持大数量
    user_id INT NOT NULL, -- 用户ID
    total_amount DECIMAL(10,2) NOT NULL, -- 总金额,精确到分
    tax_amount DECIMAL(8,2) NOT NULL, -- 税额,精确到分
    item_count SMALLINT UNSIGNED NOT NULL, -- 商品数量,非负
    status TINYINT UNSIGNED NOT NULL, -- 订单状态,使用小整数
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

-- 插入订单数据
INSERT INTO orders (user_id, total_amount, tax_amount, item_count, status) 
VALUES (1, 199.99, 16.49, 3, 1);

-- 查询订单
SELECT * FROM orders;
            

示例:产品表设计 05更多学习教程公众号风哥教程itpux_com

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY, -- 产品ID
    name VARCHAR(100) NOT NULL, -- 产品名称
    price DECIMAL(10,2) NOT NULL, -- 价格,精确到分
    cost DECIMAL(10,2) NOT NULL, -- 成本,精确到分
    stock INT UNSIGNED NOT NULL, -- 库存,非负
    min_stock TINYINT UNSIGNED NOT NULL, -- 最小库存,非负
    rating FLOAT(3,2) DEFAULT 0, -- 评分,使用浮点数
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

-- 插入产品数据
INSERT INTO products (name, price, cost, stock, min_stock, rating) 
VALUES ('iPhone 14', 5999.99, 4999.99, 100, 10, 4.8);

-- 查询产品
SELECT * FROM products;
            

9. 总结

本教程详细介绍了MySQL的数值类型,包括:

  • 整数类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
  • 浮点数类型:FLOAT, DOUBLE
  • 定点数类型:DECIMAL
  • 数值类型的属性:UNSIGNED, ZEROFILL, AUTO_INCREMENT
  • 数值类型的最佳实践
  • 常见错误与解决方案

选择合适的数值类型对于数据库的性能、存储效率和数据完整性都非常重要。在实际项目中,应根据具体的业务需求和数据特点,选择最适合的数值类型。对于需要精确计算的数据,如货币,应使用DECIMAL类型;对于范围较小的整数,应使用较小的整数类型;对于需要自动生成的ID,应使用AUTO_INCREMENT属性。 06 from mysql视频:www.itpux.com

提示:在设计表结构时,应仔细考虑每个数值字段的范围和精度需求,选择合适的数值类型,以提高数据库的性能和存储效率。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息