V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lslvxy
V2EX  ›  程序员

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

  •  
  •   lslvxy · 101 天前 · 4855 次点击
    这是一个创建于 101 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    查询性能相差并不多。但是节约的沟通和转换成本就很可观。
    banmuyutian
        18
    banmuyutian  
       100 天前   ❤️ 1
    @bthulu #12
    @seven123 #15
    enum 类型每次加一种枚举的还得改一次 DDL
    Rache1
        19
    Rache1  
       100 天前
    代码里面用枚举,数据库存英文 (⊙ˍ⊙)
    cando
        20
    cando  
       100 天前
    用 tinyint 注释里维护 1-xx 2-xx
    cco
        21
    cco  
       100 天前
    看情况,如果几个数字就能搞定就存 tinyint ,如果需要知道这个字典的大概含义,存 varchar 。
    jiangxiaoshui
        22
    jiangxiaoshui  
       100 天前
    tinyint
    gitdoit
        23
    gitdoit  
       100 天前
    java 用枚举, 数据库用字符串; 枚举->数据库 jpa 默认用枚举名称映射. 优点是看 sql 语句的时候不用查 1 2 3 4 是什么意思了, 缺点是占内存. 不过无所谓,项目对性能不敏感
    bthulu
        24
    bthulu  
       100 天前
    @banmuyutian 改 DDL 有什么要紧的, 一句话的事, 都 mysql8 了, ddl 随便改
    Paracosm
        25
    Paracosm  
       100 天前
    通过 enum 来映射吧,类里面会有相关注释的
    wolfie
        26
    wolfie  
       100 天前
    varchar(20),为了这点性能牺牲可读性太不值当了。
    jptx
        27
    jptx  
       100 天前
    看表的预估数据量,如果数据量预估不会太大,且这张表涉及的接口等调用产生的数据量也不会很大,就存 varchar 增加可读性,代码中用枚举或者常量来存放这些状态枚举,如果数据量预估会持续增长或者肯定比较大,或者涉及到的接口、调用产生的传输数据量也比较大,存 tinyint 或者 int 减少空间占用
    timethinker
        28
    timethinker  
       100 天前   ❤️ 1
    如果你的表有几千万的数据,并且值是稀疏的,可枚举的,使用 int 会比 varchar 要少占用很多的存储空间,量变决定质变。
    javlib
        29
    javlib  
       100 天前
    用 int varchar 都有个问题,如果不小心写入了一个范围外的值,代码就无法处理了,而且用 int 的可读性也很差。

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

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

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

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

    如果你的系统完全不在意性能,才考虑用字符串
    srx1982
        64
    srx1982  
       99 天前
    都说 int 和 varchar 有性能差距,那么谁能说说性能差在哪?为什么会有性能差呢?
    hhjswf
        65
    hhjswf  
       99 天前
    我见过 varchar 类型 1 、2 、3...😂
    zoyua
        66
    zoyua  
       99 天前 via iPhone
    tinyint
    sun5244725
        67
    sun5244725  
       99 天前
    当你看到数据库的数据全是 123456 时,你就想用 String 了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1177 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:20 · PVG 07:20 · LAX 16:20 · JFK 19:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.