【问题标题】:Mysql datetime DEFAULT CURRENT_TIMESTAMP errorMysql datetime DEFAULT CURRENT_TIMESTAMP 错误
【发布时间】:2023-03-22 05:44:01
【问题描述】:

1. 当我在 Windows 上运行此 MYSQL 语法时,它运行正常:

CREATE TABLE New
(
  id bigint NOT NULL AUTO_INCREMENT,
  timeUp datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
)

但是当我尝试在 Linux 上运行这段代码时,我得到了一个错误:

 #1067 - Invalid default value for 'time'

2. 在 Windows 上,大小写不敏感,例如。 Newnew 都被认为是相同的。但在 linux 上,大小写是敏感的。

Linux的配置:

MySQL 5.5.33,phpMyAdmin:4.0.5,PHP:5.2.17

Windows 配置:

MySql:5.6.11,phpMyAdmin:4.0.4.1,PHP:5.5.0

有没有办法让它们在两个系统中通用?或者任何替代方法?

【问题讨论】:

    标签: mysql linux windows


    【解决方案1】:

    在 MySQL 5.6 中添加了对 DATETIME(数据类型)的 DEFAULT CURRENT_TIMESTAMP 支持。

    在 5.5 及更早的版本中,这仅适用于 TIMESTAMP(数据类型)列。

    可以在 5.5 中使用 BEFORE INSERT 触发器为列分配默认值。

     DELIMITER $$
    
     CREATE TRIGGER ...
     BEFORE INSERT ON mytable
     FOR EACH ROW
     BEGIN
        IF NEW.mycol IS NULL THEN
           SET NEW.mycol = NOW();
        END IF;
     END$$
    

    区分大小写(对存储在列中的值的查询)是由于列使用了 collation。以 _ci 结尾的排序规则不区分大小写。例如 latin1_swedish_ci 不区分大小写,但 latin1_general_cs 区分大小写。

    SHOW CREATE TABLE foo 的输出将显示字符类型列的字符集和排序规则。这是在每列级别指定的。当新列定义未指定字符集时,在表级别指定的“默认”适用于添加到表中的新列。

    更新

    Kaii 指出,我关于“区分大小写”的回答涉及存储在列中的值,查询是否会从包含 "New" 值的列返回值,将返回带有 "t.col = 'new'" 之类的谓词。

    查看 Kaii 关于 标识符(例如表名)在 Windows 上的处理方式(默认情况下)与在 Linux 上不同的回答。

    【讨论】:

    • 你能告诉我如何执行排序规则结束
    • 我认为 OP 询问了列中 identifiers (表名、模式名)而不是 values 的区分大小写。事实上,COLLATION平等地应用于两个平台,因此在使用不同操作系统克隆数据库时不会遇到 CS/CI 排序规则的问题。但是,这不适用于标识符,因为它们直接对应于用于存储数据文件的文件系统。请参阅我的答案以获得解释。
    • 凯伊:好点子。我在查询中使用的字符类型列和表达式方面专门谈到了“区分大小写”。 OP 说 'New''new' “被认为是相同的”。我认为它是列中的值,而不是标识符,因为 'NEW' 是我们不会用作标识符的保留字。
    • FWIW:OP 创建了一个名为 New 的表,这是该字符串在他的示例中唯一出现的地方。
    • @Kaii:是的,我完全错过了。摘自 MySQL 文档 9.2.2 Identifier Case Sensitivity:“为避免此类差异导致的问题,最好采用一致的约定,例如 always 创建和引用到使用小写名称的数据库和表。建议使用此约定以实现最大的可移植性和易用性。”这就是我们始终遵循的约定,而且我们从来没有遇到过区分大小写的问题。当我看到包含大写字符的标识符时,它总是让我陷入循环。
    【解决方案2】:

    由于DEFAULT CURRENT_TIMESTAMP的问题已经得到解答,我将只回应windows和linux之间表名大小写不匹配的问题。

    在 Windows 上,文件系统默认不区分大小写。
    但在 Linux 和其他类似 *NIX 的操作系统上,它们默认区分大小写。

    您在此处获得行为不匹配的原因是文件系统,因为每个表都是作为单独的文件创建的,并且文件系统会为您处理区分大小写的问题。

    MySQL 有一个参数可以覆盖此行为:

    例如,在 Unix 上,您可以有两个名为 my_table 的不同表 和MY_TABLE,但在 Windows 上,这两个名称被认为是相同的。 避免因数据库字母大小写引起的数据传输问题或 表名,你有两种选择:

    • 在所有系统上使用lower_case_table_names=1。这样做的主要缺点是,当你使用 SHOW TABLESSHOW DATABASES 时,你会 看不到原始字母大小写的名称。

    • 在 Unix 上使用 lower_case_table_names=0,在 Windows 上使用 lower_case_table_names=2。这将保留数据库和表名的字母大小写。 这样做的缺点是你必须确保你的陈述 始终以正确的方式引用您的数据库和表名 Windows 上的信箱。如果您将您的语句转移到 Unix,其中 字母大小写很重要,如果字母大小写,它们就不起作用 不正确。

      例外:如果您使用 InnoDB 表并试图避免这些数据传输问题,则应在所有平台上设置 lower_case_table_names=1强制将名称转换为小写。

    [...]
    为避免此类差异引起的问题, 最好采用一致的约定,例如始终创建 并使用小写名称引用数据库和表。这个 建议使用约定以实现最大的便携性和易用性。

    这是MySQL manual on the case sensitivity of identifiers的摘录

    【讨论】:

    • @JohnyPie 这是一个配置选项。您需要将其放入您的 my.cnf 并重新启动 mysql 以更改此行为。
    • @JohnyPie 但手册明确指出:最好采用一致的约定(例如将所有表名都写成小写),而不是乱搞配置。
    【解决方案3】:

    如果你想默认时间必须在你的数据类型中更改为timestamp

    datetime 将显示用户输入的表格...

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

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

    【讨论】:

    • spencer7593 已经回答了我的第一个问题,你能回答我的第二个问题吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多