内容简介:本文主要介绍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
