在Navicat“设计表”中需手动输入MEDIUMTEXT或LONGTEXT,因下拉菜单默认不显示;三者容量分别为TEXT(65,535字节)、MEDIUMTEXT(16MB)、LONGTEXT(4GB),选错类型在INSERT/UPDATE时触发ERROR 1406。
TEXT、MEDIUMTEXT、LONGTEXT 在 Navicat 字段类型下拉菜单里怎么选?
navicat 的“设计表”界面中,“数据类型”下拉框默认只显示 varchar、text 等常见选项,但不会直接列出 mediumtext 或 longtext。你得手动输入——点击类型列后直接键入 mediumtext 或 longtext,navicat 会接受并保存(前提是 mysql 服务端版本支持)。
常见误操作是只选了 TEXT 就以为够用,结果后续插入超 64KB 的内容时触发 ERROR 1406: Data too long for column。MySQL 中三者的容量上限分别是:
-
TEXT:65,535 字节(约 64KB) -
MEDIUMTEXT:16MB -
LONGTEXT:4GB
选错类型不会立刻报错,但会在 INSERT 或 UPDATE 时失败,尤其在开启严格模式(STRICT_TRANS_TABLES)的生产环境。
为什么改完字段类型点了保存却没生效?
Navicat 不会在你编辑字段类型时自动执行 SQL;所有改动都暂存在客户端内存中,必须显式点击工具栏的 保存(或按 Ctrl+S)才会生成并执行 ALTER TABLE ... MODIFY 语句。
容易被忽略的几个卡点:
- 修改后关掉窗口,弹出“是否保存更改?”提示时点了“否”——所有操作丢弃
- 字段名含空格或关键字(如
order、group),Navicat 不自动加反引号,保存时报错ERROR 1064,需手动在字段名前后补上` - 表中已有数据,且新类型不兼容原值(比如从
VARCHAR(20)改成TEXT一般没问题,但从INT改成TEXT可能因隐式转换失败)
TEXT 类型字段能不能加普通索引?
不能。MySQL 规定 TEXT、MEDIUMTEXT、LONGTEXT 字段**不支持普通 B-tree 索引**(即 INDEX 或 KEY),只能建全文索引(FULLTEXT)或前缀索引(如 INDEX (intro(255)))。
如果你需要 WHERE intro = ? 这类等值查询加速,又不确定内容长度,更稳妥的做法是:
- 优先评估是否真需要存那么长——很多场景其实用
VARCHAR(1000)+ 前缀索引就够了 - 若必须用 TEXT,且要等值匹配,考虑把关键标识提取到单独的
VARCHAR字段并建索引 - 避免对 TEXT 字段做
ORDER BY或GROUP BY,容易触发磁盘临时表,拖慢查询
设置默认值为 CURRENT_TIMESTAMP 对 TEXT 字段有没有意义?
没有。MySQL 不允许给 TEXT 类型字段设置 CURRENT_TIMESTAMP 默认值,语法直接报错 ERROR 1067: Invalid default value。
这个限制和字段类型强相关:CURRENT_TIMESTAMP 只支持 TIMESTAMP 和(MySQL 5.6.5+ 的)DATETIME。TEXT 字段默认值只能是 NULL 或空字符串 '',且必须显式写出来(Navicat 的“默认值”框填 '',并确保右侧“表达式”复选框未勾选)。
真正容易踩坑的是时间戳字段本身:如果误把 updated_at 设成 TEXT,后面想加自动更新逻辑就彻底没法做了——只能删字段重建。











