Java 中 Mysql 的状态列用 int 还是用 varchar 好点

2022-03-17 00:51:55 +08:00
 lslvxy

2022 了,现在还是用 1 ,2 ,3 数字表示状态么,还是用英文表示呢

8798 次点击
所在节点    程序员
67 条回复
cco
2022-03-17 09:26:59 +08:00
看情况,如果几个数字就能搞定就存 tinyint ,如果需要知道这个字典的大概含义,存 varchar 。
jiangxiaoshui
2022-03-17 09:28:44 +08:00
tinyint
gitdoit
2022-03-17 09:30:00 +08:00
java 用枚举, 数据库用字符串; 枚举->数据库 jpa 默认用枚举名称映射. 优点是看 sql 语句的时候不用查 1 2 3 4 是什么意思了, 缺点是占内存. 不过无所谓,项目对性能不敏感
bthulu
2022-03-17 09:30:27 +08:00
@banmuyutian 改 DDL 有什么要紧的, 一句话的事, 都 mysql8 了, ddl 随便改
Paracosm
2022-03-17 09:30:56 +08:00
通过 enum 来映射吧,类里面会有相关注释的
wolfie
2022-03-17 09:33:12 +08:00
varchar(20),为了这点性能牺牲可读性太不值当了。
jptx
2022-03-17 09:36:31 +08:00
看表的预估数据量,如果数据量预估不会太大,且这张表涉及的接口等调用产生的数据量也不会很大,就存 varchar 增加可读性,代码中用枚举或者常量来存放这些状态枚举,如果数据量预估会持续增长或者肯定比较大,或者涉及到的接口、调用产生的传输数据量也比较大,存 tinyint 或者 int 减少空间占用
timethinker
2022-03-17 09:43:21 +08:00
如果你的表有几千万的数据,并且值是稀疏的,可枚举的,使用 int 会比 varchar 要少占用很多的存储空间,量变决定质变。
javlib
2022-03-17 09:44:07 +08:00
用 int varchar 都有个问题,如果不小心写入了一个范围外的值,代码就无法处理了,而且用 int 的可读性也很差。

MySQL 直接支持了 enum 类型,用 MySQL 的 enum 类型在数据库层面提供了约束,不会出现范围外的值,同时 enum 的可读性也更好。
https://dev.mysql.com/doc/refman/8.0/en/enum.html
zzfer
2022-03-17 09:51:13 +08:00
Java 里用枚举类映射,数据库里是 tinyint
godleon
2022-03-17 09:51:26 +08:00
char(1)
Felldeadbird
2022-03-17 10:10:45 +08:00
enum 是最优解,但是我不怎么用。我用数字多。因为项目大部分状态是 0 和 1 为主。如果超过范围,按照业务复杂程度选择数字还是 string 。
SurfaceView
2022-03-17 10:40:44 +08:00
tinyint
konakona
2022-03-17 11:36:17 +08:00
如果状态值不多(比如只有 1 、2 个,或者不超过 5-6 个),tinyint ,结合模型字典对照得到字符串在程序中做比较和查询使用。
如果状态值在设计阶段就已经能够预估到未来存在难以维护的现象(比如 3 代表什么,5 代表什么,然后 3 被遗弃),建议 enum ,enum 的效果同上面提到的 tiny+程序内模型字段的作用一样。

反正没 varchar 什么事。
tt0411
2022-03-17 11:40:36 +08:00
看项目规模, 如果没有千万行记录的量级, 就用 varchar 吧
Vaspike
2022-03-17 11:40:48 +08:00
用枚举+int 就好
cweijan
2022-03-17 11:41:29 +08:00
我以前是使用数字, 现在改为了使用字符串, 然后 Java 代码中使用枚举. 原因是字符串更加直观, 一看英文就知道当前属于什么状态, 而数字还需要去看代码或文档才能知道. 有的人会说数字性能更好, 但数字比字符串好的一点点性能完全不如让数据直观实在.
zw1one
2022-03-17 14:06:17 +08:00
varchar 一把梭 方便得很 不差那点性能
remarrexxar
2022-03-17 14:30:28 +08:00
enum+varchar ,纯数据和代码可读性都更好些
chrosing
2022-03-17 14:50:45 +08:00
枚举对应数据库的 tinyint(3)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/840907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX