Java 中 Mysql 的状态列用 int 还是用 varchar 好点 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
lslvxy
V2EX    程序员

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

  •  
  •   lslvxy 2022-03-17 00:51:55 +08:00 9676 次点击
    这是一个创建于 1385 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    67 条回复    2022-03-19 03:08:06 +08:00
    CEBBCAT
        1
    CEBBCAT  
       2022-03-17 01:01:52 +08:00 via iPhone   1
    确实有点难舍难分,我两种都用过,string 易读怕写错,tinyint 省空间查数据头大

    btw ,这个和语言是不是没有关系?我写 Go 多一点
    swulling
        2
    swulling  
       2022-03-17 01:06:00 +08:00 via iPhone
    除非性能敏感,我喜欢用 string ,没必要省那一点点空间牺牲 sql 的可读性。
    lslvxy
        3
    lslvxy  
    OP
       2022-03-17 01:12:41 +08:00
    @swulling 我也比较喜欢用 string ,最近接了个老项目,数据库全是 12345 ,关键还没有数据字典和注释,全靠猜,真尼玛头大
    westoy
        4
    westoy  
       2022-03-17 01:14:10 +08:00
    要查询用 int , 否则随意

    其实完全可以用个 hashmap 做封装啊
    msg7086
        5
    msg7086  
       2022-03-17 01:57:18 +08:00   2
    不写 Java ,但我一般会搞一个 enum ,然后数据库里就用 int 来映射。
    Bingchunmoli
        6
    Bingchunmoli  
       2022-03-17 02:31:34 +08:00 via Android
    @msg7086 写 java +1,我以为是规范,int 省内存太多了
    pengtdyd
        7
    pengtdyd  
       2022-03-17 02:49:15 +08:00
    新手吧,有点开发经验的人都不会问这个问题
    ericls
        8
    ericls  
       2022-03-17 07:03:46 +08:00
    enum
    MarioLuo
        9
    MarioLuo  
       2022-03-17 07:58:09 +08:00 via Android
    犹豫就用自己喜欢的那个,自从用了 mongo 就喜欢用枚举,数据库映射就是字符串,可读性高
    aaniao002
        10
    aaniao002  
       2022-03-17 08:11:49 +08:00 via Android
    我直接写中文状态+中文表头。 就是被其他 123456 项目迫害的。
    nitmali
        11
    nitmali  
       2022-03-17 08:29:17 +08:00
    tinyint
    bthulu
        12
    bthulu  
       2022-03-17 08:36:44 +08:00
    mysql 不是有 enum 类型么, 干么不用
    LowBi
        13
    LowBi  
       2022-03-17 08:45:02 +08:00 via Android
    string 了,int 只能数字,而 string 还可以包含中文,数字等,不会限制太死
    focuxin
        14
    focuxin  
       2022-03-17 08:52:48 +08:00
    数据库里 tinyint ,程序里就一个枚举类映射的事
    seven123
        15
    seven123  
       2022-03-17 08:54:23 +08:00
    2022 了,不用 enum 吗
    rockddd
        16
    rockddd  
       2022-03-17 09:01:56 +08:00
    我还是习惯在 Java 里定义 enum ,数据库存 tinyint
    VeryZero
        17
    VeryZero  
       2022-03-17 09:06:34 +08:00
    Java:enum -> MySQL:tinyint

    查询性能相差并不多。但是节约的沟通和转换成本就很可观。
    banmuyutian
        18
    banmuyutian  
       2022-03-17 09:13:23 +08:00   1
    @bthulu #12
    @seven123 #15
    enum 类型每次加一种枚举的还得改一次 DDL
    Rache1
        19
    Rache1  
       2022-03-17 09:16:11 +08:00
    代码里面用枚举,数据库存英文 (⊙⊙)
    cando
        20
    cando  
       2022-03-17 09:19:00 +08:00
    用 tinyint 注释里维护 1-xx 2-xx
    cco
        21
    cco  
       2022-03-17 09:26:59 +08:00
    看情况,如果几个数字就能搞定就存 tinyint ,如果需要知道这个字典的大概含义,存 varchar 。
    jiangxiaoshui
        22
    jiangxiaoshui  
       2022-03-17 09:28:44 +08:00
    tinyint
    gitdoit
        23
    gitdoit  
       2022-03-17 09:30:00 +08:00
    java 用枚举, 数据库用字符串; 枚举->数据库 jpa 默认用枚举名称映射. 优点是看 sql 语句的时候不用查 1 2 3 4 是什么意思了, 缺点是占内存. 不过无所谓,项目对性能不敏感
    bthulu
        24
    bthulu  
       2022-03-17 09:30:27 +08:00
    @banmuyutian 改 DDL 有什么要紧的, 一句话的事, 都 mysql8 了, ddl 随便改
    Paracosm
        25
    Paracosm  
       2022-03-17 09:30:56 +08:00
    通过 enum 来映射吧,类里面会有相关注释的
    wolfie
        26
    wolfie  
       2022-03-17 09:33:12 +08:00
    varchar(20),为了这点性能牺牲可读性太不值当了。
    jptx
        27
    jptx  
       2022-03-17 09:36:31 +08:00
    看表的预估数据量,如果数据量预估不会太大,且这张表涉及的接口等调用产生的数据量也不会很大,就存 varchar 增加可读性,代码中用枚举或者常量来存放这些状态枚举,如果数据量预估会持续增长或者肯定比较大,或者涉及到的接口、调用产生的传输数据量也比较大,存 tinyint 或者 int 减少空间占用
    timethinker
        28
    timethinker  
       2022-03-17 09:43:21 +08:00   1
    如果你的表有几千万的数据,并且值是稀疏的,可枚举的,使用 int 会比 varchar 要少占用很多的存储空间,量变决定质变。
    javlib
        29
    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
        30
    zzfer  
       2022-03-17 09:51:13 +08:00
    Java 里用枚举类映射,数据库里是 tinyint
    godleon
        31
    godleon  
       2022-03-17 09:51:26 +08:00
    char(1)
    Felldeadbird
        32
    Felldeadbird  
       2022-03-17 10:10:45 +08:00
    enum 是最优解,但是我不怎么用。我用数字多。因为项目大部分状态是 0 和 1 为主。如果超过范围,按照业务复杂程度选择数字还是 string 。
    SurfaceView
        33
    SurfaceView  
       2022-03-17 10:40:44 +08:00
    tinyint
    konakona
        34
    konakona  
       2022-03-17 11:36:17 +08:00
    如果状态值不多(比如只有 1 、2 个,或者不超过 5-6 个),tinyint ,结合模型字典对照得到字符串在程序中做比较和查询使用。
    如果状态值在设计阶段就已经能够预估到未来存在难以维护的现象(比如 3 代表什么,5 代表什么,然后 3 被遗弃),建议 enum ,enum 的效果同上面提到的 tiny+程序内模型字段的作用一样。

    反正没 varchar 什么事。
    tt0411
        35
    tt0411  
       2022-03-17 11:40:36 +08:00
    看项目规模, 如果没有千万行记录的量级, 就用 varchar 吧
    Vaspike
        36
    Vaspike  
       2022-03-17 11:40:48 +08:00
    用枚举+int 就好
    cweijan
        37
    cweijan  
       2022-03-17 11:41:29 +08:00   1
    我以前是使用数字, 现在改为了使用字符串, 然后 Java 代码中使用枚举. 原因是字符串更加直观, 一看英文就知道当前属于什么状态, 而数字还需要去看代码或文档才能知道. 有的人会说数字性能更好, 但数字比字符串好的一点点性能完全不如让数据直观实在.
    zw1one
        38
    zw1one  
       2022-03-17 14:06:17 +08:00
    varchar 一把梭 方便得很 不差那点性能
    remarrexxar
        39
    remarrexxar  
       2022-03-17 14:30:28 +08:00
    enum+varchar ,纯数据和代码可读性都更好些
    chrosing
        40
    chrosing  
       2022-03-17 14:50:45 +08:00
    枚举对应数据库的 tinyint(3)
    javapythongo
        41
    javapythongo  
       2022-03-17 14:58:00 +08:00
    现在是用 varchar
    lmmlwen
        42
    lmmlwen  
       2022-03-17 15:02:11 +08:00
    我怀疑这个论坛人的真实水平,可能只有菜鸡会上这个论坛吧,居然这么多人说用枚举,笑死人了
    weizhen199
        43
    weizhen199  
       2022-03-17 15:42:52 +08:00
    要不试试 bit
    keepeye
        44
    keepeye  
       2022-03-17 15:46:34 +08:00
    居然这么多人说牺牲这点性能值得,这边牺牲一点那边牺牲一点,真当服务器不要钱啊
    yibo2018
        45
    yibo2018  
       2022-03-17 15:49:43 +08:00
    代码中肯定是用 enumerate ,方便管理使用
    至于映射到 MySQL 是什么反而随意了,int varchar 都不差,MySQL 中的 enum 我没用过(没听过哈哈)

    我觉得代码中一定要用 enumerate 去限制,这个很重要
    raptor
        46
    raptor  
       2022-03-17 15:51:25 +08:00
    其实吧,我通常用 CHAR ,固定一或两个字符可以表示很多状态了,也比 INT 直观一些,2 位 CHAR 比一个 64 位 INT 占空间还少,性能的话跟 INT 也没差,应该能比 VARCHAR 好。
    dq19871123
        47
    dq19871123  
       2022-03-17 15:57:41 +08:00
    考虑这个问题的前提是你的业务真的有那么大量,否则那点性能差异根本不是瓶颈,所以一般情况下你觉得什么顺手用什么,看什么顺眼用什么,甚至抓阄决定都可以。
    binge921
        48
    binge921  
       2022-03-17 16:16:49 +08:00
    数据量百万以上 建议 int 你会回来感谢我
    sdxlh007
        49
    sdxlh007  
       2022-03-17 16:19:51 +08:00
    int+枚举
    o00o
        50
    o00o  
       2022-03-17 16:31:07 +08:00   2
    @lmmlwen 出来说说,只破不立非君子 讽而不教亦小人
    go522000
        51
    go522000  
       2022-03-17 17:54:00 +08:00
    先收藏,蹲答案。。。以前习惯用 1234 来表达不同的状态,后来遇到有客户流程随便改,用数字很容易混乱,现在项目习惯用 varchar 加字典来表示。
    jtwor
        52
    jtwor  
       2022-03-17 17:57:49 +08:00
    tinyint
    jjianwen68
        53
    jjianwen68  
       2022-03-17 18:03:02 +08:00
    用什么 varchar ,定长不是用 char 更合适吗
    documentzhangx66
        54
    documentzhangx66  
       2022-03-17 19:26:35 +08:00
    @lmmlwen 微软的蓝屏代码,本质是就是枚举。你觉得你比微软强?证明一下。
    documentzhangx66
        55
    documentzhangx66  
       2022-03-17 19:32:39 +08:00
    楼上说用枚举其实才是最正确的。原因是,枚举的本质,是对数据与意义,做强一致性约束。这种约束能强迫大家统一数据与规范,能提高整个系统的正确性与可靠性。当然,万事万物都有缺点,枚举的缺点是效率低,具体一点是,每次使用时,都要先查一下;如果需要创建新的状态,还要走一个申请流程,还要查一下是否重复或冲突。
    sampeng
        56
    sampeng  
       2022-03-17 19:42:58 +08:00
    无论如何都是 enum 。。。自从我好多年前知道有 enum 这样的类型后,再不会设计 int 型数据表示状态。

    可读性,约束性,比一切都重要。改 ddl 再 2022 年了不要太简单。无论是流程和工具,都是非常 easy 的事。但是让我去看一个 sql 满屏幕的 xx=1 ,xx=3.。我日他先人。。。
    jiom
        57
    jiom  
       2022-03-17 19:56:48 +08:00
    Java 用枚举类映射->数据库里是 tinyint~也没什么不可读性的~
    Suaxi
        58
    Suaxi  
       2022-03-17 21:32:02 +08:00
    枚举 + varchar
    ricky077
        59
    ricky077  
       2022-03-17 23:15:42 +08:00
    @sampeng 说实话,当量达到一定数量的时候,改 DDL 非常头疼,一个不到 1000 万级的大表,需要停服,一个字段数据库跑 10 几分钟
    xuanbg
        60
    xuanbg  
       2022-03-18 07:04:33 +08:00
    tinyint ,写好注释就完事。
    CantSee
        61
    CantSee  
       2022-03-18 11:06:16 +08:00
    我们是有一个状态码表和状态码枚举类,业务表的状态根据这个来映射,字段类型用 tinyint 或 char 都可以
    opengps
        62
    opengps  
       2022-03-18 11:14:10 +08:00
    tinyint ,预留扩展枚举的余地
    seakingii
        63
    seakingii  
       2022-03-18 12:28:21 +08:00
    肯定是 int,tinyint 类型.
    性能和存储空间更重要.可读性可以靠文档来解决,但因为用字符串造成的性能问题很难用其它办法来解决.

    如果你的系统完全不在意性能,才考虑用字符串
    srx1982
        64
    srx1982  
       2022-03-18 16:19:32 +08:00
    都说 int 和 varchar 有性能差距,那么谁能说说性能差在哪?为什么会有性能差呢?
    hhjswf
        65
    hhjswf  
       2022-03-18 18:07:13 +08:00
    我见过 varchar 类型 1 、2 、3...
    zoyua
        66
    zoyua  
       2022-03-18 21:42:20 +08:00 via iPhone
    tinyint
    sun5244725
        67
    sun5244725  
       2022-03-19 03:08:06 +08:00
    当你看到数据库的数据全是 123456 时,你就想用 String 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3184 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 04:31 PVG 12:31 LAX 20:31 JFK 23:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86