【问题标题】:MySQL CURRENT_TIMESTAMP Error Parsing DDL for microsecondsMySQL CURRENT_TIMESTAMP 解析 DDL 为微秒的错误
【发布时间】:2014-05-05 10:13:52
【问题描述】:

这是我想要的 MySQL 表,但是关注datum_en_tijd

CREATE TABLE `navigatie` (
    `navigatie_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`navigatie_id`),
    `huidige_vraaggroep` varchar(255) NOT NULL,
    `vorige_vraaggroep` varchar(255) DEFAULT NULL,
    `richting` varchar(255) NOT NULL,
    `datum_en_tijd` timestamp(3) NOT NULL,
    `schadegeval_id` bigint(20) UNSIGNED DEFAULT NULL,
    `claim_id` bigint(20) UNSIGNED DEFAULT NULL,
    `gebruiker_id` bigint(20) NOT NULL,
    `soort_gebruiker` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如您所见,TIMESTAMP(3) 持续毫秒
每当我尝试在 MySQL Workbench 中 Alter Table... 时,我都会收到此错误:
当我查看 DDL 时,我会得到一个带有此查询的新选项卡:

delimiter $$

CREATE TABLE `navigatie` (
  `navigatie_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `huidige_vraaggroep` varchar(255) NOT NULL,
  `vorige_vraaggroep` varchar(255) DEFAULT NULL,
  `richting` varchar(255) NOT NULL,
  `datum_en_tijd` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
  `schadegeval_id` bigint(20) unsigned DEFAULT NULL,
  `claim_id` bigint(20) unsigned DEFAULT NULL,
  `gebruiker_id` bigint(20) NOT NULL,
  `soort_gebruiker` varchar(255) NOT NULL,
  PRIMARY KEY (`navigatie_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

注意变化

`datum_en_tijd` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),

这是一个错误还是什么? 还要注意第 8 行 MySQL WorkBench 上的 SYNTAX ERROR 给我们: 我正在运行 MySQL 5.6.16

【问题讨论】:

    标签: mysql timestamp workbench


    【解决方案1】:

    不兼容的更改:在非常旧的 MySQL 版本(4.1 之前)中, TIMESTAMP 数据类型支持显示宽度,它是静默显示的 从 MySQL 4.1 开始忽略。这在 MySQL 5.1 中已弃用,并且 在 MySQL 5.5 中完全删除。这些行为变化可能导致 尝试将 TIMESTAMP(N) 列与 MySQL 5.5 或更高版本的服务器:

    When importing a dump file (for example, one created using mysqldump) created in a MySQL 5.0 or earlier server into a server from
    

    较新的版本系列,CREATE TABLE 或 ALTER TABLE 语句 包含 TIMESTAMP(N) 会导致导入失败并出现语法错误。

    To fix this problem, edit the dump file in a text editor to replace any instances of TIMESTAMP(N) with TIMESTAMP prior to
    

    导入文件。请务必为此使用纯文本编辑器,并且 不是文字处理器;否则,结果几乎肯定是 无法导入 MySQL 服务器。

    http://dev.mysql.com/doc/refman/5.1/en/timestamp-initialization.html

    所以你不能拥有

    `datum_en_tijd` timestamp(3)
    

    你需要使用

    `datum_en_tijd` timestamp 
    

    `datum_en_tijd` datetime(3)
    

    【讨论】:

    • 但它说从 5.6 开始我可以拥有timestamp(n),请参阅:dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
    • 我明白了,所以从 5.5 开始我不能使用 timestamp(n)。好吧,所以我必须使用TIME(n)DATETIME(n) 来表示分数?
    • 没错,注意ON UPDATE只能与TIMESTAMP一起使用,但不能与TimeDATETIME一起使用
    • 您能否编辑您的答案,使用'datum_en_tijd' datetime(3) 会更好,因为那将是我的答案?因为我不想在初始查询中使用DEFAULTON UPDATE 子句。
    【解决方案2】:

    是的,时间戳不再需要这个了,我通常只是将它与 DEAFAULT 或 ON UPDATE CURRENT_TIMESTAMP 一起使用,您可能会发现它们都有用。

    【讨论】:

      【解决方案3】:

      可供选择的一些变体:

      created_attimestamp(3) NOT NULL DEFAULT '1970-01-01 12:34:56'

      mysql_row_created_attimestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)

      created_attimestamp(3) NULL DEFAULT NULL

      各有优缺点。

      不要(永远)使用日期时间,因为它没有相关的时区,它几乎就像一个(打包的)字符串。

      MySQL 时间戳类型以 UTC 物理存储(它是一个 UNIX 纪元增量)。它在会话的活动时区呈现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        • 2015-07-20
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多