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

请教:数据库表达类型,用字符串还是数字

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

    比如我有一条数据,这条数据有个类型字段,比如 主数据还是次级数据

    这种场景下,我们表达类型可以用 1,2 也可以用字符串 main secondary

    我考虑着,在不考虑存储容量的情况下,用哪种类型,对于数据库来说,是不是是一样的啊?

    以前的话,服务器蛮贵的,很多时候要考虑容量,现在一般都不太考虑容量了

    请教各位大佬,除了存储容量之外,哪种类型,会有性能影响不?

    谢谢

    20 条回复    2022-08-15 16:34:11 +08:00
    lmshl
        1
    lmshl  
       226 天前
    mysql / postgresql 都原生支持 enum type ,可以结贴了吧
    brader
        2
    brader  
       226 天前
    这类数据我自己以及见过比较多的是使用 tinyint 做状态
    zmal
        3
    zmal  
       226 天前
    mysql 的 emun 蛮垃的,千万别用。
    mysql 的话正常来说用 tinyint 就可以了。用什么类型更多是业务方面的考量,性能差距不大。
    Leviathann
        4
    Leviathann  
       226 天前
    @lmshl mysql 老版本不支持
    qW7bo2FbzbC0
        5
    qW7bo2FbzbC0  
       226 天前
    实际我遇到的情况看来,数据库中很少用 enum 格式的,而且不止为何,不推荐使用 enum 格式。

    我更推荐 int 或 varchar 这种直接的类型。

    单就 int 和 varchar 来说,如果情况可以固定描述,我更倾向于 varchar 这种显式表意的方式

    另,在 sof 上也有些人推荐使用 static class with const property 来取代代码中的 enum 类型
    xtreme1
        6
    xtreme1  
       226 天前
    @qW7bo2FbzbC0
    数据库 enum 你新增一次类型,就得改一次 ddl
    lmshl
        7
    lmshl  
       226 天前
    懂了,结论:别用垃圾 mysql 。
    起码 postgresql 的 enum 只要不改顺序,新增类型都是瞬间完成的。
    westoy
        8
    westoy  
       226 天前
    有一港一, 我用 pg 一样用 smallint ,enum 是咩?
    mringg
        9
    mringg  
       226 天前
    如果没有排序、超高性能需求,字符串更直观些
    swcat
        10
    swcat  
       226 天前
    我自己设计的话, 之前一般都是 tinyint, 总部那边同步过来的都是 char, 比如 currency, country, ap code, 状态
    因为这个被叼过, 可读性比少存要重要
    heyjei
        11
    heyjei  
       226 天前
    我直接用 varchar ,比如字段 status 直接用 正常,停用等,要使用 123 ,你还得维护一套码表。
    123qwerty
        12
    123qwerty  
       226 天前
    @lmshl 在存储大小(与个数相关)和不改顺序的情况下,mysql 也是瞬间完成的
    debuggerx
        13
    debuggerx  
       226 天前
    用枚举,用其他的都是大聪明行为,不解释
    ragnaroks
        14
    ragnaroks  
       226 天前
    各种数据库实现的 byte 类型,实体类写好 getter/setter 转换关系
    lovephpframework
        15
    lovephpframework  
       226 天前
    肯定会影响性能啊,int 更快,建议用 tinyint,然后具体含义在 php 里用 const 定义好,写在 mysql 的注释里面基本没人看,业务改了之后也容易忘记改
    nothingistrue
        16
    nothingistrue  
       226 天前
    首先排除数据库的枚举类型——除非你明确使用一种数据库且这数据库对枚举类型支持的很好,否则遍地是坑。

    如果你真得不考虑存储容量的话,用字符串是最省事和最可靠的,他能跟枚举无缝对接。但是事实上除了演示系统外没有不考虑容量的。就算你不考虑存储容量,也得考虑索引空间。就算上面都不考虑,( Java )枚举自身也可能会扩展成 value-name-detail 的字典形式。所以在适当的时候,这个适当的时候由你自己决定,还是要考虑用 tinyint 类型。
    dcsuibian
        17
    dcsuibian  
       226 天前
    倾向于字符串,对 DBA 更友好。

    如果你对性能要求特别高,那用数字整形也可以。但从数据库里取出来的时候,要尽快转换成字符串或枚举。

    最恶心的是那种从数据库到 json 都是数字的。
    鬼知道这个数字代表什么,就算知道了,每次看到这个数字,自己脑袋里还得先 map 一下。
    murmur
        18
    murmur  
       226 天前
    我们的 type 现在全是英文,枚举也是英文,做报表就知道这样的好处了,你如果全是 int 代表类型,没有编码表,做报表的想杀人
    murmur
        19
    murmur  
       226 天前
    不对,type 是中文,utf8 环境拼音和英文没任何区别,换成英文多此一举短字符串果断中文
    xuanbg
        20
    xuanbg  
       226 天前
    用数字不会写错,因为无论谁用这个字段都要先搞清楚 123 分别对应什么。直接存字符串的话就怕不小心拼写错了就对不上了。
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   3046 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 13:51 · PVG 21:51 · LAX 06:51 · JFK 09:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.