You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

datetime字段过滤时SELECT与DELETE行为不一致问题排查

问题描述

我执行了以下SQL代码:

CREATE TABLE test_tab (
  create_time datetime(6) NOT NULL,
  PRIMARY KEY (create_time)
);

INSERT INTO test_tab (create_time) VALUES ('2023-04-21 00:17:24.000000000');
COMMIT;

SELECT * FROM test_tab WHERE create_time = '2023-04-21 00:17:24.000000000';
DELETE FROM test_tab WHERE create_time = '2023-04-21 00:17:24.000000000';
COMMIT;
SELECT * FROM test_tab WHERE create_time = '2023-04-21 00:17:24.000000000';

执行后两次SELECT语句均返回一行数据,已执行DELETE操作却未删除对应数据。使用的数据库版本为:mysql Ver 15.1 Distrib 10.3.38-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

原因分析
  • 字段精度截断导致值不匹配:表中create_time字段定义为datetime(6),仅支持存储6位小数的时间精度。插入9位小数的时间值时,MariaDB会自动截断超出的3位,实际存储的值是'2023-04-21 00:17:24.000000'。
  • 隐式转换逻辑差异:SELECT语句会将查询条件的9位小数字符串隐式转换为datetime(6)类型(截断到6位),因此能匹配到存储的数据;但该版本MariaDB的DELETE语句未做同样的截断处理,尝试用完整9位小数去匹配存储的6位值,导致匹配失败,无数据被删除。
解决方案

有两种可行的处理方式:

  1. 匹配字段精度调整查询条件:将DELETE语句中的时间值截断到6位小数,与字段定义一致:
    DELETE FROM test_tab WHERE create_time = '2023-04-21 00:17:24.000000';
    
  2. 修改字段精度适配输入值:如果需要存储9位小数的时间,将字段类型改为datetime(9):
    ALTER TABLE test_tab MODIFY COLUMN create_time datetime(9) NOT NULL;
    
    修改后执行原DELETE语句即可生效。

内容的提问来源于stack exchange,提问作者enedil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:02:55