MySQL建表时如何正确选择数据类型?实战经验总结

MySQL——表创建时数据类型选择 文章目录前言概述数字类型日期类型字符串类型 前言 在数据库表的创建时,往往会对各种列类型的选择很迷茫。 本篇博客重点说明表创建时,各项列类型的区别和合理选择。 概述 在MySQL中,通常情况下列的数据类型一般会选用以下几种: 确定合适的大类型:数字、字符串、时间、二进制; 确定具体的类型:有无符号、取值范围、变长定长等。 在MySQL数据类型设置方面,尽量用更小的数据类型,因为它们通常有更好的性能,花费更少的硬件资源。并且,尽量把字段定义为NOT NULL,避免使用NULL。 数字类型 类型 大 阅读详情

在数据库表结构设计中,数据类型的选择直接影响存储效率、查询性能和数据准确性。本文结合真实开发场景,深入解析常见数据类型的选型原则,帮你避开新手常踩的坑。

一、整数类型:根据业务范围精确选型

1. 四大整型对比

类型字节有符号范围无符号范围
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32768 ~ 327670 ~ 65535
INT4-2147483648 ~ 21474836470 ~ 4294967295
BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1

实战建议:

  • 用户年龄:TINYINT UNSIGNED(0-255足够)

  • 订单数量:INT UNSIGNED(单表42亿条足够)

  • 分布式ID:BIGINT UNSIGNED(使用雪花算法时必选)

错误案例:

# 错误!用户ID可能超过INT上限
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY
);
二、浮点与精确计算:金融字段必须警惕

1. 浮点类型

  • FLOAT:4字节,约7位精度

  • DOUBLE:8字节,约15位精度

2. 精确计算

  • DECIMAL(M,D):M总位数,D小数位数

    • DECIMAL(10,2):共10位,2位小数

使用场景:

# 正确!金额必须使用DECIMAL
CREATE TABLE orders (
    amount DECIMAL(12,2) NOT NULL
);

# 错误!浮点导致精度丢失
CREATE TABLE payments (
    amount FLOAT NOT NULL  
);
三、字符串类型:定长与变长的博弈

1. VARCHAR vs CHAR

类型特点适用场景
VARCHAR变长(+1-2字节长度头)用户名、地址等变长字段
CHAR定长固定长度代码(如ISO国家代码)

存储示例:

# 正确使用CHAR
CREATE TABLE countries (
    code CHAR(2) NOT NULL  # ISO两位国家代码
);

# 正确使用VARCHAR
CREATE TABLE products (
    sku VARCHAR(20) NOT NULL  # 变长商品编码
);

2. TEXT家族的陷阱

  • TEXT:最大64KB

  • MEDIUMTEXT:16MB

  • LONGTEXT:4GB

使用原则:

  • 当长度可能超过VARCHAR(65535)时再使用TEXT

  • 避免在WHERE条件中使用TEXT字段


四、时间类型:时区问题关键所在

1. 主要时间类型

类型格式范围字节时区敏感
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 ~ 9999-12-318否
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 ~ 2038-01-194是

选择策略:

  • 日志记录:TIMESTAMP(自动转换UTC)

  • 生日字段:DATE(无需时间部分)

  • 跨时区系统:TIMESTAMP + 存储UTC时间

建表示例:

CREATE TABLE events (
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expire_date DATE NOT NULL
);
五、ENUM与SET:谨慎使用的双刃剑

1. ENUM类型

  • 值必须是预定义列表中的一个

  • 存储为整数(节省空间)

适用场景:

# 有限状态字段
CREATE TABLE orders (
    status ENUM('pending', 'paid', 'shipped') NOT NULL
);

2. SET类型

  • 可保存多个值的组合

  • 最大64个成员

使用案例:

# 用户权限存储
CREATE TABLE users (
    permissions SET('read', 'write', 'delete') NOT NULL
);

避坑指南:

  • 当可能新增选项时,避免使用ENUM/SET

  • 超过20个选项时改用关联表


六、JSON类型:灵活存储的利器(MySQL 5.7+)

使用场景:

  • 动态字段(如商品属性)

  • 日志详情等非结构数据

示例:

CREATE TABLE product_properties (
    id BIGINT,
    attributes JSON NOT NULL,
    INDEX ((CAST(attributes->'$.color' AS CHAR(20))))
);

# 查询JSON字段
SELECT * FROM product_properties 
WHERE attributes->'$.color' = 'red';

注意事项:

  • JSON字段不支持默认值

  • 更新整个JSON列会导致重写整个文档


七、终极选型原则
  1. 最小够用原则:能用TINYINT就不用SMALLINT

  2. 未来扩展性:预计用户量暴增?提前用BIGINT

  3. 业务匹配度:金额必须DECIMAL,时间戳选TIMESTAMP

  4. 性能权衡:VARCHAR(255)与VARCHAR(1000)的存储开销相同

  5. 编码影响:UTF8MB4字符集下,VARCHAR(255)最多占255*4=1020字节


避坑检查清单:

  • 主键是否用了足够大的类型?

  • 金额字段是否使用DECIMAL?

  • 时间字段是否考虑了时区?

  • VARCHAR长度是否合理预估?

  • 是否滥用TEXT类型?

通过合理选择数据类型,可使表结构更健壮,存储效率提升50%以上。你在建表时最常纠结哪种类型的选择?欢迎在评论区交流实战经验!

如何使用Google Maps API爬取地理数据:详细教程与Python实现 Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。 阅读详情

相关推荐

实测对比:DeepSeek、豆包、千问三大AI模型生成测试用例谁更强?(附完整代码)

本文通过实测对比了DeepSeek、豆包、千问三大AI模型在生成测试用例方面的表现。文章提供了完整的Python代码实现,详细分析了各模型在用例完整性、准确性、边界覆盖及幻觉控制等维度的差异,并分享了工程化集成与多模型融合等优化策略,旨在帮助测试团队选择合适工具以提升工作效率。

ik6789012的博客 959

MySQL表字段数据类型设计建议

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

qq_42872034的博客 1494

ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)解决办法

问题:ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 很久没用这台电脑的mysql了,今天需要连接数据库,启动数据库报错: ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 解决方法: 查阅资料后知道了,应该使用已知的用户名和密码登陆 mysql -u root -p 然而密

一个超会写Bug的程序猿的博客 43万+

【MySQL】数据类型&建表

Q:如果我想创建一个名字为create 或 database的数据库,可不可以?A:因为它们是MySQL的关键字。A:MYSQL中允许开发者使用关键字命名,但是在使用的时候要用反引号把关键字引起来。反引号在键盘上的位置,ESC下边,TAB上边,1的左边,要用英文字符。使用其他的关键字的时候也是一样的,from\to\password\user。

2401_83227065的博客 1526

如何解决ipa包上传App Store Connect时出现的无效二进制文件问题

本文详细解析了ipa包上传App Store Connect时出现无效二进制文件问题的常见原因及解决方案。从Scheme配置、架构支持到权限声明,提供了全面的检查步骤和实用技巧,帮助开发者快速定位并解决上传问题,确保应用顺利通过审核。

weixin_28833069的博客 316

若依框架二次开发——若依 Vue3 版本前端样式优化指南

若依框架二次开发——若依 Vue3 版本前端样式优化指南

bjzhang75的博客 1693

MySQL建表常见数据类型(超实用)

我们在设计表时常常会遇到各种数据类型选择的问题,以下收集的类型希望可以帮助到你

weixin_41857176的博客 1775

Firefox卸载卡住不动的解决方案

本文主要介绍了Firefox卸载卡住不动的解决方案,希望能对使用Windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 15万+

MySQL数据类型选择

数据库数据类型的选择 确定合适的大类型:数字、字符串、时间、二进制 确定具体类型:有无符号、取值范围、变长还是定长

Soil_Three_66的博客 969

【GPFS专题5】---IBM Spectrum Scale (GPFS) 日常运维命令大全

掌握这些命令是有效管理 GPFS 集群的基础。实际生产环境中,建议结合自动化脚本和监控系统(如 IBM Storage Insights)实现高效运维。定期备份配置、监控性能指标,并进行灾备演练,是保障数据安全和系统稳定的关键。

jundao1997的专栏 841

【unity实战】Cinemachine虚拟相机实战,使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制

这里主要是探讨如何使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制,我们主要专注Cinemachine实战效果,所以并不会深入讨论Cinemachine和CharacterController比较细节的参数介绍。注意:前面为了测试方便,我还是先用的旧的输入系统代替InputSystem【推荐100个unity插件之10】Unity最全的最详细的Cinemachine(虚拟相机系统)介绍,详细案例讲解,快速上手。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3753

MySQL:数据类型&建表

如果按照一般的类型来建带有关键字的库就会出现报错如果我们这样写的话:`关键词 `,则会建库成功。

blamep的博客 1401

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MySQL_数据类型&建表

M 表⽰以字符为单位的最⼤列⻓度,取值范围0 ~ 65,535 (在所 有列中共享),有效⻓度取决于实际字符数和使⽤的字符集,并且⽤额外的⼀或两个字节记录实际使 ⽤的字节数,当实际字节数不超过255个字节⽤⼀个字节记录⻓度,超过255个字节时,使⽤两个 字节记录⻓度,获取列的值时不会从尾部删除空格,插⼊数据时会删除超出⻓度的空格。允许定义 CHAR(0),此时列的值只能为NULL或空字符串,主要的⽬的是为了旧系兼容,⽐如类中必须有这个 属性,但不使⽤这个属性的值,也就是说值并没有意义,但列⼜不能没有。

eternal__day的博客 1837

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mysql建表时性别选择_MySQL建表时如何选中合适的数据类型

char与varchar????char:固定長度的字符类型。varchar属于可变的字符类型。(那我们究竟选哪个,记住选择varchar没毛病!!!)????为什么选择varchar,总结为三点char处理速度快,但检索时char列时,会删除尾部的的空格,部分数据丢失的风险我们不想承担。MySQL5.5后我们默认存储引擎为InnoDB,它对长度是否固定没有区分。主要性能取决于数据行的存储量,我们的可变长度的...

weixin_35511255的博客 4282

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL的建表建库学习心得

在建库时,我们需要注意数据库的命名规范,通常应遵循一定的规则,如名称不能包含特殊字符,应该简洁明了,能够反映数据库的主要用途。除了上述基本操作外,我还学习了一些高级的建表技巧,例如使用视图(VIEW)来简化复杂的查询,使用存储过程(PROCEDURE)和触发器(TRIGGER)来自动化处理数据,以及使用事务(TRANSACTION)来保证数据的一致性和完整性。理解查询优化器的工作原理,包括它如何评估不同查询计划的代价,如何使用统计信息,以及如何调整查询以更好地利用优化器,都需要深入的知识和经验。

lewuhu753的博客 1658

MySQL数据库建表

自学建库建表笔记

FBJSSSSS的博客 1447

设计表时,如何选择正确的数据类型

MySQL 支持的数据类型非常多,在合适的场景下,选择正确的数据类型对于获得高性能至关重要。本文讲述了几个简单的原则,从而作出更好的设计

chenjiazhanxiao的博客 1236

mysql学习-建表时每个列如何选择数据类型01

建表时每个列如何选择数据类型 MySQL 提供了大量的数据类型,为了优化存储和提高数据库性能,在任何情况下都应该使用最精确的数据类型。 字符串类型是通用的数据类型,任何内容都可以保存在字符串中,数字和日期都可以表示成字符串形式。 但是也不能把所有的列都定义为字符串类型。对于数值类型,如果把它们设置为字符串类型的,会使用很多的空间。 并且在这种情况下使用数值类型列来存储数字,比使用字符串类型更有效率。 另外需要注意的是,由于对数字和字符串的处理方式不同,查询结果也会存在差异。 例如,对数字的排序与对字符串的排

1497

数据库小白必看!手把手教你用MySQL建库建表(实战经验分享)

先画ER图再动手字段类型要合适约束条件不能少索引优化要趁早测试数据跑一遍最后送大家一个彩蛋:在建表语句末尾加上(很多教程都漏了这个!

INosdfgs的博客 1043

MYSQL数据类型和建表

根据业务场景平衡存储、性能和精度(如用。

2302_79462679的博客 717

MySQL 核心:常用数据类型与两种建表方式(实战指南)

MySQL 数据类型与建表方式实战摘要 本文介绍了 MySQL 日常开发中最常用的数据类型和两种核心建表方法: 常用数据类型: 整数类型(INT/TINYINT/BIGINT) - 存储不同范围的整数 小数类型(DECIMAL/FLOAT) - DECIMAL适合精确计算(如金额) 日期类型(DATE/DATETIME) - 处理时间信息 文本类型(VARCHAR/TEXT) - 存储字符串,需平衡查询速度与空间 特殊类型(ENUM/JSON) - 处理固定值或灵活数据结构 建表方式: 直接定义字段 - 适

m0_60277481的博客 1029

MySQL — 数据库建库与建表

MySQL数据库建库与建表是数据库设计的核心环节。建库时需通过CREATE DATABASE语句定义数据库名称,并指定字符集(如utf8mb4)和排序规则(如utf8mb4_unicode_ci),以确保多语言兼容性和数据存储规范。使用IF NOT EXISTS可避免重复创建冲突。建表需使用CREATE TABLE语句,明确表名、字段名、数据类型及约束条件。字段设计需合理选择数据类型,例如整型(INT)、可变字符串(VARCHAR)、日期(DATE)等,同时设定长度限制。

2403_89893216的博客 1442

【通关MySQL】建库,建表,认识数据类型

初识MySQL,建库,查库,删库,建表,常见数据类型等等!

冲击大厂之路!!! 988

MySQL之数据类型,建表以及约束

1.回顾MySQL入门 2.MySQL数据类型介绍 MySQL中定义数据字段的类型对数据库的优化非常重要 MySQL支持多种类型,大致分为三类:数值,日期/时间和字符串(字符) ①字符类型:char,varchar,text,blob ②数值类型:int,bigint,float,decimal ③日期类型:data,time,datetime,timestamp date: yyyy:MM:dd HH:mm:ss time: HH:mm:ss datetime: ...

小宝的宝呢的博客 625

mysql建表优化

建表优化随笔前言一、关于 char,varchar,text的选择二、小数类型三、datetime , timestamp , date的使用四、索引创建总结 前言 之前建表比较随意,最近看了些文章总结了一点建表方面觉得值得注意的地方 一、关于 char,varchar,text的选择 char 是定长的,插入的数据超长不会截取直接报错,插入数据不足规定长度的,右边补空格,查询出来的数据也会有空格,在读取的时候可能要多次用到trim()。因为char是定长的,所以查询的效率比varchar高(后面会将

xiaoqiqilang的博客 1563
上一篇: 深入理解MySQL中的脏读、幻读、不可重复读(附实战复现源码)
下一篇: MySQL建表到底要不要加外键?血泪教训总结
码里看花‌
博客等级 码龄8年 321粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码里看花‌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值