MySQL 时间存储类型的问题 - V2EX
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
syncher
V2EX    MySQL

MySQL 时间存储类型的问题

  •  1
     
  •   syncher 2017-08-08 10:22:18 +08:00 8061 次点击
    这是一个创建于 3064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,MySQL 中时间到底怎么存储最好,datetime、timestamp or int ? 为什么?

    第 1 条附言    2017-08-08 18:29:01 +08:00

    感觉这个问题没有绝对答案,需要根据应用场景,总结一下各位的答案:

    • int

      优点: 存储基本类型,精度高,范围查找快

      缺点: 使用 cursor 分页时很容易出问题;需要转化;

    • timestamp

      优点: 方便时间函数操作

      缺点: 会随时区变化

    • datetime

      优点:方便时间函数操作

    根据各位的建议选 datetime 或者 int 比选 timestamp 方便一些,不知道我理解的对不对。

    29 条回复    2017-08-09 07:03:33 +08:00
    lol173
        1
    lol173  
       2017-08-08 11:42:10 +08:00
    我做过的大多数项目都是用 int,如果我主导的话,我会用 timestamp
    strict
        2
    strict  
       2017-08-08 12:17:33 +08:00
    你存 int,到时 sqlalchemy 怎么 filter
    siteshen
        3
    siteshen  
       2017-08-08 12:56:18 +08:00
    epoch 用 int 精度不够,使用 cursor 分页时很容易出问题。
    一直用的 timestamp with time zone (postgres)。

    @strict filter 前转成 int

    Query.filter(user.created_at < datetime.now()) # timestamp
    Query.filter(user.created_at < TO_INT(datetime.now())) # int
    syncher
        4
    syncher  
    OP
       2017-08-08 12:58:17 +08:00 via Android
    @siteshen @strict @lol173 感谢回复。timestamp 排序是不是没有 int 快
    moult
        5
    moult  
       2017-08-08 13:09:02 +08:00 via iPhone
    如果存储时间都不用 datetime,那么 MySQL 这个字段类型设计出来干嘛用?
    回归实际的话,看你需求了。脱离需求谈设计愧对扯淡。
    Infernalzero
        6
    Infernalzero  
       2017-08-08 13:44:24 +08:00
    int or bigint
    数据库一般只用最基本类型
    syncher
        7
    syncher  
    OP
       2017-08-08 13:48:39 +08:00
    @moult @Infernalzero 感谢回复,我大概找到答案了,同意 @moult 说的看需求
    https://stackoverflow.com/questions/409286/should-i-use-field-datetime-or-timestamp
    U7Q5tLAex2FI0o0g
        8
    U7Q5tLAex2FI0o0g  
       2017-08-08 13:51:26 +08:00
    一直都用 datetime 或 date
    lshero
        9
    lshero  
       2017-08-08 13:55:16 +08:00 via Android
    更应该考虑是否可能会面临时区转换问题
    syncher
        10
    syncher  
    OP
       2017-08-08 13:56:14 +08:00
    @littleylv 我是想如果用 datetime 是不是不便于查找,我想在该列上建立索引,这样是不是应该用 int?
    LYEHIZRF
        11
    LYEHIZRF  
       2017-08-08 14:07:49 +08:00
    mysql 有很多 date 相关函数可以看看
    LYEHIZRF
        12
    LYEHIZRF  
       2017-08-08 14:09:03 +08:00
    timestamp 会随时区变化
    surfire91
        13
    surfire91  
       2017-08-08 14:17:07 +08:00
    偏向于 timestamp or datetime (看具体需求了),而不是 int or bigint , 因为有很多 date 函数方便使用。
    U7Q5tLAex2FI0o0g
        14
    U7Q5tLAex2FI0o0g  
       2017-08-08 14:18:43 +08:00
    @syncher #10 一般时间字段没必要建索引吧。至于查找,无非就是时间段吧,直接 between
    nullen
        15
    nullen  
       2017-08-08 14:54:15 +08:00
    用 datetime
    lepig
        16
    lepig  
       2017-08-08 14:57:31 +08:00
    @moult 同意。datetime 一个好处就是查库的时候可以直接读取。不然还得复制出来转换一下。
    danielmiao
        17
    danielmiao  
       2017-08-08 15:07:40 +08:00
    bigint,可以支持到 ms,剩下所有的转换都在代码完成,减少数据库运算量
    magicdawn
        18
    magicdawn  
       2017-08-08 15:21:00 +08:00
    datetime 或者 int 都可以, timestamp 随时区变化...不好
    http://magicdawn.ml/2017/05/18/mysql-timezone/
    solomaster
        19
    solomaster  
       2017-08-08 16:12:34 +08:00
    @magicdawn 为什么随时区变化不好?难道不是更方便用户吗?全球各地用户看到都是当地时间。
    loveCoding
        20
    loveCoding  
       2017-08-08 16:29:50 +08:00
    datetime
    bk201
        21
    bk201  
       2017-08-08 16:32:45 +08:00
    @Infernalzero 你时区还要另外存吗
    danielmiao
        22
    danielmiao  
       2017-08-08 16:35:53 +08:00
    @solomaster 第一时区是数据库服务器时区或者是你应用服务器的时区,并不是访问用户的时区,实际使用中出问题的概率远大于方便。试想某一台服务器的时区设置有误。。。在复杂的分布式环境下。。。要多久才能排查到服务器时区的问题。。。。
    zjsxwc
        23
    zjsxwc  
       2017-08-08 16:36:21 +08:00
    我习惯 bigint 存时间戳
    solomaster
        24
    solomaster  
       2017-08-08 17:51:26 +08:00
    @danielmiao 噢噢对,是根据服务器所在地的时区来的。刚才脑子抽了想到另一个问题上去了……
    ngloom
        25
    ngloom  
       2017-08-08 18:45:58 +08:00
    第一份工作里用的是 string 存的时间串,
    跳了以后公司里用的是 datetime,
    后者比前者好太多...
    Infernalzero
        26
    Infernalzero  
       2017-08-08 20:09:56 +08:00   1
    @bk201 都存整形了还和时区有啥关系
    gdrk
        27
    gdrk  
       2017-08-08 20:18:06 +08:00 via Android
    @zjsxwc +1 感觉这样也挺好的
    realpg
        28
    realpg  
    PRO
       2017-08-09 01:24:25 +08:00
    bigint 大法好
    myzyq
        29
    myzyq  
       2017-08-09 07:03:33 +08:00 via Android
    datetime 肯定比 int 有用的多,看你需要这个时间做什么,如果你只是存个时间记录下,datetime 肯定更直观,如果需要一些筛选操作,datetime 的可操作性更高! timestamp 基本没用过!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2589 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 06:37 PVG 14:37 LAX 22:37 JFK 01:37
    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