V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
solaro
V2EX  ›  MySQL

为什么辣么多人喜欢用 tinyint 而不用 enum?

  •  
  •   solaro · 2015-11-03 16:32:07 +08:00 · 12502 次点击
    这是一个创建于 3343 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,同样的场景,字段是固定的,例如男女性别,做过辣么多项目,就没有一个用枚举的,全都是 tinyint ,而且也有很多人明明 id 不能为带符号的,创建表就是不愿意加上 unsigned ,难道我有强迫症?

    32 条回复    2015-11-04 21:30:55 +08:00
    fengwuxin
        1
    fengwuxin  
       2015-11-03 16:34:01 +08:00
    能实现就行,干嘛纠结
    yongzhong
        2
    yongzhong  
       2015-11-03 16:35:48 +08:00
    你见过所有字段全用 varchar 的嘛,id,时间啥的全是 varchar
    est
        3
    est  
       2015-11-03 16:35:54 +08:00
    unsigned 不算强迫症,可以考虑改过来。

    enum 移植性不如 tinyint 。
    nigelvon
        4
    nigelvon  
       2015-11-03 16:38:38 +08:00
    enum 后期修改维护什么的坑多。大部分人对这个都没有足够经验。规避风险还是用 tinyint 吧。
    Zzzzzzzzz
        5
    Zzzzzzzzz  
       2015-11-03 16:39:04 +08:00   ❤️ 1
    google 搜索 enum is evil 就能找到一堆原因了。

    unsigned 是 mysql 独有的特性, 不建议使用。
    letitbesqzr
        6
    letitbesqzr  
       2015-11-03 16:42:24 +08:00
    我们公司就 type status 之类的字段使用 "0 1 2 3 4 5" 来代表,统一使用枚举
    lincanbin
        7
    lincanbin  
       2015-11-03 16:56:14 +08:00   ❤️ 1
    可扩展性
    kslr
        8
    kslr  
       2015-11-03 17:22:45 +08:00
    @yongzhong 艾玛,我感觉存时间戳挺好用的 varchar (20), mysql 预设的感觉都不好用。
    Felldeadbird
        9
    Felldeadbird  
       2015-11-03 19:29:26 +08:00 via iPhone   ❤️ 1
    enum 坑大啊,查 sql 要写上引号,否则查询不了?
    jaguar
        10
    jaguar  
       2015-11-03 19:42:29 +08:00
    全用 text 路过
    letitbesqzr
        11
    letitbesqzr  
       2015-11-03 21:35:58 +08:00
    @Felldeadbird hibernate 的话能自动处理
    msg7086
        12
    msg7086  
       2015-11-03 21:47:54 +08:00
    为了兼容性。
    你用了一堆 enum 要是回头说转到 postgresql 玩了难道整个系统返修一遍么……
    (而且像 Rails 什么的早就支持在框架内自动映射数字到枚举了。
    jhdxr
        13
    jhdxr  
       2015-11-03 22:50:12 +08:00
    当你某天 BOSS 告诉你我们要在男和女之外增加一个『保密』时你就会觉得 enum 不如 tinyint 了。。。
    (神马?保密就让值为 null ?那再加一个『人妖』好了


    enum 在 alter table 时的开销巨大。哪怕你只是新增一个值, mysql ( 5.6 及 5.6 之前,因为我没研究过 5.7 )依然会重建整个表_(:з」∠)_
    realpg
        14
    realpg  
       2015-11-03 23:02:43 +08:00
    @kslr 时间戳不是应该 unsigned int 么 如果考虑到整型溢出的问题 unsigned bitint 就够了啊 这才 4 字节,你那 varchar 就 20 字节了
    littlehz
        15
    littlehz  
       2015-11-03 23:26:34 +08:00
    @realpg int 存时间可读性差呀,每次查询出来都要记得用内置函数转换下。另外如果时间需要精确到毫秒的呢?
    shenqiu15
        16
    shenqiu15  
       2015-11-03 23:27:50 +08:00
    看上面全用 text 或 varchar 的,只能说现在的年轻人啊,太浮躁了,学习一点关系型数据库知识有好处的。
    raysmond
        17
    raysmond  
       2015-11-03 23:28:45 +08:00
    enum 经常用啊
    realpg
        18
    realpg  
       2015-11-03 23:30:14 +08:00
    @littlehz
    没觉得可读性差啊 脑袋自带粗略转换功能
    需要的话,毫秒时间戳也不是不行啊。

    而且,从来没觉得有很多需要去数据库的界面直读时间串的,在任何程序界面都很好转换成可读的。

    部分调试、维护场景,可以头脑粗略转换
    littlehz
        19
    littlehz  
       2015-11-03 23:49:35 +08:00
    @realpg 当然不是说时间用 varchar 存,个人不喜欢用 int 存。 mysql 自己的 datetime 就不错,显示成字符串,存储占 8 字节。
    wjfz
        20
    wjfz  
       2015-11-04 01:03:56 +08:00
    @kslr
    用 varchar 存时间戳,当某条数据早于 2001/9/9 9:46:40 的时候排序会遇到问题。


    @littlehz
    如果这时候有个只显示年月日这种需求,转换起来可能没那么方便。
    leebo
        21
    leebo  
       2015-11-04 02:01:52 +08:00
    我觉得还是迁移问题吧
    Delbert
        22
    Delbert  
       2015-11-04 07:15:34 +08:00 via Android
    我记得我用 bigint 存的时间戳,输出的时候爱怎么转换怎么转换。
    MrJing1992
        23
    MrJing1992  
       2015-11-04 08:44:37 +08:00
    移植和迁移
    Chappako
        24
    Chappako  
       2015-11-04 08:50:00 +08:00
    看来我一直用 enum 和 unsigned 没什么好处…… 还好现在开始用 sqlalchemy 不用考虑这些了
    Infernalzero
        25
    Infernalzero  
       2015-11-04 09:26:46 +08:00
    这和时间用 bigint 存而不用 date 或者 timestamp 是一个道理
    lostsnow
        26
    lostsnow  
       2015-11-04 09:55:43 +08:00
    说个邪恶的理由吧, 也许性别有一天变的不止男女, 至于 type/status 之类的字段 变化的可能性会更高
    Mac
        27
    Mac  
       2015-11-04 10:45:39 +08:00
    我会说我用 char(2)来做么,是,否。。。。
    zjqzxc
        28
    zjqzxc  
       2015-11-04 12:02:22 +08:00   ❤️ 1
    Facebook 包含了 56 种非传统性别
    http://www.guokr.com/article/438003/
    如果哪天老板想不开也想跟国际接轨的话,画面还是比较美的。

    曾经有个知乎段子:大意是说有个字段原本只有两种可能的值,开始时候偷懒就 true/false 了,后来需求改了,这个字段可能有三种值了。。。
    varnotfound
        29
    varnotfound  
       2015-11-04 16:54:54 +08:00   ❤️ 1
    用 mysql 的 enum 代替字符型的值是蛮好的,排序似乎不怎么方便吧;对于 tinyint 的列,你用 enum 来枚举值不会混乱么?而且 tinyint 占用的空间也不大,对于开发来说用 tinyint 还是比较愉快的

    至于数据类型的问题, mysql 执行的建表语句,并不是你输入什么就给你执行什么, mysql 会帮你优化数据类型后再建表( mysql 认为你定义的数据类型不够好,会自动帮你换掉的, innodb 下可以试试看),你可以用"show create table 表名 "看看你实际创建表的语句
    sorra
        30
    sorra  
       2015-11-04 17:05:47 +08:00
    Hibernate 默认是 自动转 int ,按声明顺序
    mko0okmko0
        31
    mko0okmko0  
       2015-11-04 19:03:03 +08:00 via Android
    雖然各種資料庫都用很久了,最後都會選擇主流資料庫都能互相遷移的欄位,又因為 SQLite 沒有時間欄位,又遇到跨時區主機同步問題,時間欄位乾脆用浮點數欄位存 utc 秒時間,小數點存毫秒,毫秒都會小誤差就是,
    cszchen
        32
    cszchen  
       2015-11-04 21:30:55 +08:00
    tinyint 的性能和 enum 差不多,用 tinyint ,程序更容易扩展,所以一般需要用枚举的字段,我全部用 tinyint
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:01 · PVG 23:01 · LAX 07:01 · JFK 10:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.