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

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

  •  
  •   NoKey · 2022-08-15 11:40:51 +08:00 · 3306 次点击
    这是一个创建于 824 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    谢谢

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

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

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

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

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

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

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