navicat 中设置 unsigned 属性需在字段类型下拉菜单中直接选择如 int unsigned 等含“unsigned”字样的整数类型,而非勾选独立开关;若已有数据含负值或默认值为负,则修改会失败。

Navicat 里怎么选 UNSIGNED 属性
Navicat 本身不直接提供独立勾选“无符号”的 UI 开关,它的整型字段是否无符号,完全取决于你选择的 数据类型 名称。比如 INT 和 INT UNSIGNED 是两个不同的类型选项,不是在同一个类型下再点个复选框。
常见误区是以为能在字段属性面板里手动打勾“Unsigned”,实际上 Navicat 的字段类型下拉菜单里已经把带无符号的版本单独列出来了。
- 新建表或修改字段时,在
数据类型下拉框中直接找含UNSIGNED字样的项,例如:TINYINT UNSIGNED、SMALLINT UNSIGNED、INT UNSIGNED、BIGINT UNSIGNED - 如果下拉列表里没看到带
UNSIGNED的选项,说明当前连接的数据库类型不支持(比如 SQLite 就不支持 unsigned),或 Navicat 版本较老未自动识别 MySQL 8.0+ 的完整类型列表 - 使用
ENUM、SET或JSON等类型时,UNSIGNED不可用 —— 它只适用于整数类型
为什么改了类型还是没生效
改完字段类型后点击保存,Navicat 默认会尝试用 ALTER TABLE ... MODIFY COLUMN 执行变更,但某些情况下它会静默失败或回退到原类型,尤其是当字段已有数据且超出无符号范围时。
典型错误现象:Out of range value for column 'xxx' 或保存后类型又变回 INT。
- 确保现有数据全为非负数:比如字段当前有
-5,而你改成INT UNSIGNED,MySQL 会拒绝并报错 - 检查字段是否有默认值或约束(如
DEFAULT -1),这些也必须同步改为非负值 - 如果字段被索引、外键或视图引用,部分 MySQL 版本(如 5.7)可能限制直接修改 unsigned 属性,需先删索引再改,再重建
不同 MySQL 版本对 UNSIGNED 的兼容注意点
MySQL 8.0.16 起废弃了 INTEGER UNSIGNED 在生成列(generated column)中的部分用法,而 Navicat 若基于旧版驱动生成 DDL,可能仍按老语法输出,导致执行失败。
- Navicat 15+ 对 MySQL 8.0 支持较好,但若连接的是 MySQL 5.6,
MEDIUMINT UNSIGNED可能显示为灰色不可选(因旧版元数据接口未暴露该类型) - 复制表结构时,Navicat 默认不会保留
UNSIGNED标识,除非你在“高级”选项里勾选Include column attributes - 导出 SQL 时,确认导出设置中启用了
Use unsigned types when possible(路径:工具 → 选项 → 导出 → MySQL → 勾选该项)
用 SQL 直接写更可靠
当图形界面反复不生效,或者要批量处理多个字段时,绕过 Navicat 的类型下拉,直接写 ALTER TABLE 更可控。
ALTER TABLE `users` MODIFY COLUMN `age` TINYINT UNSIGNED NOT NULL DEFAULT 0;
这样能明确控制每项定义,避免 Navicat 自动补全带来的歧义(比如它可能把 INT 自动转成 INT(11),而 INT(11) UNSIGNED 其实和 INT UNSIGNED 等价,但括号里的数字容易让人误以为影响取值范围)。
真正容易被忽略的是:unsigned 改变的是数值上限,不是存储空间 —— INT 和 INT UNSIGNED 都占 4 字节,只是后者把原本负数的区间挪给了正数用。











