bin
发布于

修改触发器之前丢失的日期时间值

正在创建一个以 MySQL 作为数据库的身份验证服务器。 我正在使用一个表来存储刷新令牌,它看起来像这样:

CREATE TABLE IF NOT EXISTS REFRESH_TOKEN (
    TOKEN VARCHAR(512) NOT NULL,
    EXPIRATION DATETIME
) ENGINE=INNODB;

为了确保正确,我使用以下触发器:DATETIME

  DROP TRIGGER IF EXISTS TG_RT_EXP;
DELIMITER //
CREATE TRIGGER TG_RT_EXP BEFORE INSERT ON REFRESH_TOKEN
FOR EACH ROW 
BEGIN
    SET NEW.EXPIRATION = FROM_UNIXTIME(NEW.EXPIRATION);
END;//
DELIMITER ;

为了测试两者,下面是 used 语句(从 jwt.io 中提取的值)

INSERT INTO REFRESH_TOKEN
(TOKEN, EXPIRATION)
VALUES (
    'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
    1796239022
);

INSERT 发生后,ID 为 1265 的警告指出数据被截断,并且每个新行都有值,而不是相应的转换。我删除了触发器,得到的值为 ,所以我猜测它与 INSERT 值格式有关。这与触发器、INSERT 值格式、列数据类型有关还是其他原因?1969-12-31 16:00:000000-00-00 00:00:00

编辑:如果尝试执行

  INSERT INTO REFRESH_TOKEN
(TOKEN, EXPIRATION)
VALUES (
    'eyJhbGciOiJIUzI...',
    FROM_UNIXTIME(1796239022)
);

该值已正确插入且未显示警告,为什么不能将其转换为触发器?

浏览 (43)
点赞
收藏
1条评论
Klustron小助手
Klustron小助手
试将 BIGINT 值插入 DATETIME 列。 在执行任何触发器操作之前,该值将根据列数据类型转换为 DATETIME。此转换根据日期和时间文本中描述的规则执行: 作为 YYYYMMDDhhmmss 或 YYMMDDhhmmss 格式的数字,前提是该数字作为日期有意义。例如,19830905132800 和 830905132800 被解释为“1983-09-05 13:28:00”。 因此,提供的值被视为不正确的 DATETIME 值(它与上述任何格式都不匹配,因为它会产生不正确的 MONTH 值 96 或 23),并且转换结果为零日期或 NULL(您可以使用确保)。当触发器触发时,为列提供的值已转换为 NULL。这会导致错误、NULL 或零日期值,具体取决于 Server SQL 模式。1796239022SELECT CAST(1796239022 AS DATETIME)
点赞
评论