MySQL问题记录

MySQL中的 char 与 varchar的区别是什么?

MySQL中的 char 和 varchar 都是用于存储字符串的数据类型,但它们在存储方式和性能上有所不同。以下是它们的主要区别:

第一点呢,就是存储方式不同:

  • char:定长字符串,长度是固定的,不管实际存储的字符串长度如何,都会占用固定长度的存储空间。如:char(10) 会始终占用10个字 符的空间。
  • varchar:变长字符串,长度不固定。占用的空间与实际存储的字段长度有关。 如:varchar(10) 表示最多可以存储10个字符,如果存储 的字符串长度不足10,假设为5,只会占用5个字符空间。

第二点呢,就是性能不同:

  • 对于char,由于其固定长度,操作会快些,但是会存储浪费磁盘空间的问题。
  • 对于varchar,由于长度可变,操作时会相对慢一点,但是可以节省磁盘空间,尤其是存储的数据长度不固定时。

所以呢,我们在设计表结构的时候,需要根据具体的场景来选择具体的数据类型。 就比如啊,如果是手机号、身份证号这样的字段,由于长 度固定,我们就直接选择char类型即可,并指定长度,如:char(11)、char(18)。再比如,像用户名、备注信息这类长度不固定的,我们直接 选择varchar类型,长度根据页面原型和需求文档确定。


MySQL记录货币用什么字段类型

正确选择:DECIMAL(M, D)

  • M:总位数(精度),包括整数和小数部分
  • D:小数位数(标度)

常见用法示例

sql 复制代码
-- 适合大多数场景:最大 9999999.99 元(约7位整数 + 2位小数)
DECIMAL(10, 2)

-- 金融级大额场景:支持万亿级别
DECIMAL(19, 2)  -- 如 999,999,999,999,999,999.99

💡 一般建议:DECIMAL(10,2)DECIMAL(12,2) 足够覆盖绝大多数业务(如电商、支付、账单等)。

为什么不能用 FLOAT / DOUBLE

因为它们是浮点数类型 ,存在精度丢失问题

sql 复制代码
-- 示例(在某些计算中):
SELECT 0.1 + 0.2 = 0.3;  -- 结果可能是 FALSE!

货币计算要求精确到分(0.01),任何舍入误差都可能导致:

  • 对账不平
  • 用户投诉
  • 财务风险

IEEE 754 浮点标准无法精确表示 0.1、0.2 等十进制小数。

总结

货币字段 = DECIMAL(M, D),其中 D 通常为 2,M 根据业务最大金额预留足够位数。
永远不要用 FLOATDOUBLE 存金额!

这是数据库设计中的最佳实践,也是金融、电商等系统的通用规范。


相关推荐
zcmodeltech5 分钟前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
AI多Agent协作实战派21 分钟前
AI多Agent协作系统实战(四十):AI说“没有错误“,系统判了“测试失败“——一个正则的误判
数据库·人工智能
隔窗听雨眠1 小时前
OceanBase接入DeepSeek:数据库与AI的深度融合如何改写企业数据规则
数据库·人工智能·oceanbase
lv__pf1 小时前
spring之整合mybatis【TL spring 12】
mysql·spring·mybatis
playboy1341 小时前
工作室 NAS 存储故障-办公室所有数据无法访问怎么办
数据库
byxdaz2 小时前
jeston平台交叉编译Poppler库与预览pdf文件
数据库
SilicoCode2 小时前
江科大STM32入门:FLASH闪存详解——从结构原理到读写保护
数据库·mongodb
一个有温度的技术博主3 小时前
DeepSeek Harness 深度解析:与 LangChain / LangGraph 的本质区别
数据库·oracle·langchain·harness
Wang's Blog3 小时前
PostgreSQL笔记4: 市场地位、生态全景与行业应用实践
数据库·笔记·postgresql
隔窗听雨眠5 小时前
Oracle误Truncate操作恢复:从原理到实战的完整指南
数据库·oracle