MySQL 8.0+ 且连接字符集为 utf8mb4 时,Laravel 迁移的 comment() 才能正确存储中文注释;需配置数据库 charset、collation 及建库字符集,并注意 GUI 工具解码问题。

MySQL 8.0+ 才支持字段 COMMENT 中文,Laravel 迁移里写 comment 没用?
不是没用,是得满足两个硬性前提:数据库版本 ≥ 8.0,且连接字符集必须是 utf8mb4(不能是 utf8)。Laravel 的 comment() 方法只是把注释塞进 SQL 的 COMMENT 子句,最终能否存住中文,全看 MySQL 底层是否认这个编码。常见错误现象是迁移成功但查 information_schema.COLUMNS.COLUMN_COMMENT 为空,或显示乱码——基本就是字符集没对上。
- 检查当前连接字符集:
SHOW VARIABLES LIKE 'character_set_client';,必须是utf8mb4 -
config/database.php中 MySQL 配置要显式指定:'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci' - 建库时也要用
CREATE DATABASE xxx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;,否则新表默认可能沿用服务器旧设置
Laravel 迁移中给字段加中文注释的正确写法
从 Laravel 8 开始,Schema::table() 和 Blueprint 支持直接链式调用 comment(),但仅限于新增字段或修改字段定义时;单纯改注释需要 change() 配合,且必须启用 doctrine/dbal 扩展。
- 新增字段带注释:
$table->string('name')->comment('用户真实姓名')->nullable(); - 修改已有字段注释(需先
composer require doctrine/dbal):$table->string('name')->comment('用户全名')->change(); - 注意:MySQL 5.7 不支持对已存在字段仅改
COMMENT,change()会重建字段,有锁表风险 - 注释长度限制为 1024 字符,超长会被 MySQL 截断,不报错
PHPMyAdmin / Navicat 看不到中文注释?别急着改 Laravel
很多 GUI 工具默认用 latin1 或 utf8 解析元数据,即使数据库存的是正确的 utf8mb4 注释,界面也可能显示问号或空。这不是 Laravel 或迁移的问题,而是客户端解码错了。
- 在 PHPMyAdmin 中,点击右上角「刷新」按钮旁的齿轮图标 → 「常规设置」→ 「MySQL 字符集」选
utf8mb4 - Navicat 连接属性 → 「高级」→ 勾选「使用 MySQL 字符集」,并确认「初始字符集」是
utf8mb4 - 最准的验证方式是直接执行 SQL:
SELECT COLUMN_NAME, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME = 'users' AND TABLE_SCHEMA = 'your_db';,看返回结果是否为原样中文
多语言字段注释怎么存?Laravel 不负责翻译,只负责存原始字符串
Laravel 迁移本身不提供多语言注释机制,comment() 接收的就是一个纯字符串。所谓“多语言”,实际是业务层自己决定怎么组织这些字符串——比如用 JSON 格式存,或按语言代码分字段存,但这和迁移无关。
- 强行在
comment里写 JSON:comment('{"zh":"创建时间","en":"created at"}'),可行但不推荐:工具不识别、无法被 IDE 提示、违反 COMMENT 语义 - 更合理的方式是:注释只写一种主语言(如中文),多语言说明放在文档或模型注释里,用
@propertyPHPDoc 标注 - 如果真要动态注释,应该在部署后通过 SQL 或 DBA 脚本批量更新
information_schema,而不是塞进 Laravel 迁移
字段注释这事,本质是数据库元数据管理,Laravel 只是个搬运工。真正容易被忽略的是:不同环境(开发/测试/生产)的 MySQL 版本和字符集配置是否完全一致——差一个点,中文就变问号。











