Navicat 16中默认值被自动加单引号是因为输入框默认为字符串字面量模式,必须点击fx按钮启用表达式模式后输入CURRENT_DATE或CURRENT_TIMESTAMP(不加引号、括号),才能生成无引号的DEFAULT CURRENT_DATE语句。

Navicat 16 里直接在「默认值」输入框敲 CURRENT_DATE 或 CURRENT_TIMESTAMP,保存后变成 'CURRENT_DATE' ——这不是 bug,是它默认把输入当字符串字面量处理。必须主动切换到表达式模式,否则永远加引号。
为什么默认值被自动加单引号?
Navicat 的「默认值」输入框有两个隐含状态:普通文本模式(默认)和表达式模式。你没点 fx 按钮或勾「表达式」复选框时,它就把所有输入当成字符串,原样套上单引号生成 DEFAULT 'xxx'。哪怕你输的是函数名、数字或关键字,只要没启用表达式,一律字符串化。
常见后果:
-
CURRENT_TIMESTAMP变成'CURRENT_TIMESTAMP'→ 插入时存的是字面字符串,不是当前时间 -
0被写成'0'→ 对INT字段触发Incorrect integer value -
abc被写成'abc'→ 看似对,但若字段是ENUM('abc','def'),而你漏了引号又没启表达式,反而可能因类型校验失败
怎么正确启用表达式模式?
不是改输入内容,而是改输入方式。关键动作只有三步:
- 选中目标字段(类型必须匹配:DATE/DATETIME/TIMESTAMP 才能用
CURRENT_DATE或CURRENT_TIMESTAMP;INT/BIGINT 才能用0或1等数值) - 在右侧属性面板找到「默认值」栏,点击右侧的
fx按钮(不是直接打字) - 在弹出窗口中切到「表达式」标签页,输入
CURRENT_DATE(不带引号、不带括号),确认
成功后,该字段的「默认值」列会显示为 EXPRESSION: CURRENT_DATE,而不是纯文字。
哪些值必须走表达式,哪些不能?
区分依据是 MySQL 是否需要运行时求值:
- 必须走表达式:任何函数或关键字,如
CURRENT_DATE、CURRENT_TIMESTAMP、USER()、UUID() - 不能走表达式:字符串字面量(如
'pending')、数字(如0、1.5)、NULL(直接输NULL,不加引号)——这些在普通模式下输对格式即可 - 特别注意:
NOW()和CURDATE()在 Navicat 中兼容性差,部分版本拒绝识别为合法表达式,优先用CURRENT_DATE和CURRENT_TIMESTAMP
保存后怎么验证是否真生效?
别信界面显示,看生成的 SQL:
- 右键表 →「对象信息」→ 切换到「创建语句」标签页
- 搜索
DEFAULT,确认对应字段是DEFAULT CURRENT_TIMESTAMP(无引号),而不是DEFAULT 'CURRENT_TIMESTAMP' - 如果导出 DDL 后发现又被转成带引号的字符串,说明 Navicat 版本存在导出逻辑缺陷(Navicat 16.0.x 早期版本有此问题),需手动编辑导出 SQL 或升级到 16.1+(2026 年已稳定)
最易忽略的一点:表达式只在 INSERT 时不显式提供该字段值时才触发;一旦你在 INSERT 里写了 created_at = NULL 或 status = '',MySQL 就不会回退到默认值,哪怕它是表达式。











