必须勾选“表达式”复选框,否则Navicat将CURRENT_DATE当作字符串处理导致默认值失效;同时需确保字段类型为DATE或DATETIME、MySQL版本≥5.6.5,并在导出时检查DDL是否含无引号的DEFAULT CURRENT_DATE。
Navicat 中设置字段默认值为 CURRENT_DATE 的实际操作路径
navicat 的「默认值」输入框不接受直接写 current_date 并点保存就生效——它会自动加单引号变成字符串字面量,导致插入时存的是字面字符串 "current_date",而非真正的日期。必须切换到「表达式」模式才能正确识别。
- 在设计表界面选中目标日期字段(类型应为
DATE或DATETIME) - 找到「默认值」一栏,点击右侧的「…」按钮(不是直接输文字)
- 在弹出窗口中选择「表达式」标签页,输入
CURRENT_DATE(不带引号、不带括号) - 确认后该字段的「默认值」列会显示为
EXPRESSION: CURRENT_DATE
为什么用 CURRENT_DATE 而不是 NOW() 或 CURDATE()
三者行为差异直接影响字段兼容性和语义准确性:
-
CURRENT_DATE返回纯日期(如2024-05-21),适配DATE类型字段,无时间部分干扰 -
NOW()和CURDATE()在 MySQL 中虽常等效,但NOW()实际返回DATETIME,若字段是DATE类型,MySQL 会隐式截断时间部分——看似可用,但属于隐式转换,易在严格模式下报错 - Navicat 对
CURDATE()支持不稳定,部分版本会误判为函数调用而拒绝保存;CURRENT_DATE是 SQL 标准关键字,兼容性最好
保存后发现默认值没生效?检查这三点
即使配置了表达式,默认值仍可能不触发,常见原因如下:
- INSERT 语句中显式给该字段赋了
NULL或空值:MySQL 会优先使用你写的值,忽略默认值;确保 INSERT 不包含该字段,或明确写DEFAULT - 字段允许为
NULL且未设「非空」约束:MySQL 在遇到 NULL 插入时不会回退到默认值,而是直接存 NULL;建议勾选「非空」(NOT NULL) - 建表 SQL 被导出再导入时丢失表达式:Navicat 导出的 DDL 可能将
CURRENT_DATE写成字符串,需手动检查生成的 SQL 是否含DEFAULT CURRENT_DATE(无引号)
MySQL 版本与严格模式的影响
CURRENT_DATE 作为默认值从 MySQL 5.6.5 开始原生支持,但行为受 SQL 模式控制:
- 若启用
STRICT_TRANS_TABLES,对DATE字段设NOW()默认值会直接报错;而CURRENT_DATE始终安全 - MySQL 8.0+ 支持
CURRENT_DATE用于TIMESTAMP字段,但 Navicat 可能不识别——此时建议改用CURRENT_TIMESTAMP配合TIMESTAMP类型 - 低版本 MySQL(如 5.5)不支持列级默认表达式,Navicat 即使配置成功,执行建表也会失败;务必确认服务端版本
DEFAULT CURRENT_DATE,不是界面上看起来像对了就行。











