DBeaver 不自动为 ENUM 字段提供下拉菜单,因其 JDBC 驱动将 ENUM 视为 VARCHAR 且默认不查 INFORMATION_SCHEMA;需手动配置“值约束”启用枚举选项,导出 DDL 时须开启 useInformationSchema=true 才保留原始 ENUM 定义。

枚举字段在 DBeaver 里不能直接下拉选值
这是最常被误解的一点:DBeaver 的数据编辑器(表格视图)**不会为 ENUM 类型字段自动渲染下拉菜单**,哪怕你建表时写了 ENUM('active', 'inactive', 'pending')。它只当普通字符串显示和编辑,输入什么就存什么——不校验、不提示、不拦截非法值。
原因很简单:JDBC 驱动层把 ENUM 当作 VARCHAR 或 CHAR 返回,DBeaver 没法从元数据中可靠识别出“这是枚举”,更没法拿到合法值列表。MySQL 官方 JDBC 驱动(Connector/J)默认关闭 useInformationSchema=true,而 ENUM 值定义藏在 INFORMATION_SCHEMA.COLUMNS 里,不主动查就看不到。
想让枚举值可选,得手动配“列约束”
DBeaver 支持给任意列配置“值约束(Value Constraints)”,本质是给编辑器加一层本地校验和补全,不改变数据库结构,但能防止手误输错。
- 右键数据表 → 编辑表(Edit Table) → 切到 列(Columns) 标签页
- 找到你的 ENUM 字段(比如
status),点击右侧 … 按钮打开“列属性” - 在 值约束(Value Constraints) 区域,选择 枚举(Enum) 类型
- 在下方输入框里填入合法值,用英文逗号分隔:
active,inactive,pending - 勾选 启用约束(Enable constraint),保存退出
之后在数据浏览视图双击该字段编辑时,就会弹出下拉菜单供选择。注意:这个约束只在 DBeaver 界面生效,不影响其他客户端或 SQL 直接插入。
SQL 编辑器里写 INSERT/UPDATE 时怎么补全枚举值?
纯靠代码补全不行——DBeaver 的 SQL 补全默认不解析 ENUM 值。但你可以用两个办法绕过:
- 在
INSERT INTO table (status) VALUES (...)的括号里,手动触发补全(Ctrl+Space),如果之前在“列约束”里设过该字段的枚举值,**且当前光标在单引号内**,DBeaver 有时会提示你预设的选项(非稳定,依赖驱动返回的列类型精度) - 更可靠的是用 SQL 模板:在
窗口 → 首选项 → 用户界面 → 内容辅助 → 模板里新建一个,比如名字叫enum_status,内容写成'${status:enum(active,inactive,pending)}'。插入时输入enum_status+ Ctrl+Space 就能展开带下拉的占位符 - 别依赖“自动补全延迟调低”来解决这个问题——延迟再低,没元数据支撑也补不出枚举值
导出/同步表结构时,ENUM 定义容易丢
用 DBeaver 导出 DDL(右键表 → 生成 SQL → DDL)时,默认可能只输出 status VARCHAR(20),而不是原始的 status ENUM('active','inactive','pending')。这是因为 DBeaver 读取列类型时 fallback 到了通用字符串类型。
要确保导出完整 ENUM 定义,必须满足两个条件:
- 连接配置里开启
useInformationSchema=true(在连接编辑器 → 驱动属性 页添加该键值对) - 建表语句本身得是标准 MySQL 语法,不能混用
ENUM和SET或其他非标准扩展
否则,即使你在 DBeaver 里手动设了列约束,导出的 SQL 也不会包含真实 ENUM 定义——这在团队协作或 CI/CD 场景下是个隐形坑,尤其当你以为“界面里设了就等于 DB 里有”时。











