不能只在phpMyAdmin改表字符集,因为Laravel的配置、迁移文件、模型与数据库实际字符集必须严格对齐;仅改表会导致charset/collation不一致,引发乱码、查询失败或索引错误。
直接在 phpmyadmin 里改表字符集,大概率会让 laravel 应用报错或存乱码——因为 laravel 的迁移机制、模型配置和数据库实际字符集必须对齐,光改表不够。
为什么不能只在 phpMyAdmin 点几下就完事?
phpMyAdmin 只改了物理表的 CHARACTER SET 和 COLLATION,但 Laravel 的 config/database.php 里 charset 和 collation 还是旧值;迁移文件没更新,下次跑 php artisan migrate:fresh 会还原成老字符集;Eloquent 模型如果用了 $casts 或 json 字段,还可能因排序规则不兼容触发隐式转换失败。
常见错误现象包括:
- 保存中文时变成
????或空字符串 - 执行
DB::table('users')->where('name', '张三')->first()查不到数据(排序规则不匹配) - 运行
php artisan migrate报错:SQLSTATE[HY000]: General error: 1709 Index column size too large(utf8mb4 + 原有索引长度超限)
正确步骤:从配置到迁移再到表结构
先确认目标字符集是 utf8mb4(Laravel 5.4+ 默认推荐),不是过时的 utf8(它最多只支持 3 字节 Unicode,不支持 emoji 和部分生僻汉字)。
操作顺序必须是:
立即学习“PHP免费学习笔记(深入)”;
- 修改
config/database.php中 MySQL 配置块的'charset' => 'utf8mb4'和'collation' => 'utf8mb4_unicode_ci'(或更现代的utf8mb4_0900_as_cs,取决于 MySQL 版本) - 在
AppServiceProvider::boot()中加Schema::defaultStringLength(191)(解决索引长度限制问题) - 写一个新迁移文件,用
DB::statement()批量转换已有表,例如:DB::statement("ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); - 不要用 phpMyAdmin 的「操作 → 排序规则」批量改——它不会更新列级 collation,且对
TEXT类型字段可能漏处理
phpMyAdmin 仅适合验证和补救
如果你已经误操作,或者需要快速检查当前状态,phpMyAdmin 可以用来:
- 查表实际字符集:
SHOW CREATE TABLE users;—— 看输出里DEFAULT CHARSET=和各列的COLLATE - 手动修复单个字段(比如某个
TEXT列没被迁移脚本覆盖):ALTER TABLE users MODIFY content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 但别用界面里的「更改」按钮直接点选 collation——它生成的 SQL 常缺
CONVERT TO,只改表级不改列级,Laravel 写入时仍可能出问题
最易被忽略的是索引长度:MySQL 5.7.7+ 默认 innodb_large_prefix=ON,但很多旧环境仍是 OFF。如果没提前调 defaultStringLength(191),迁移时建索引就会失败,而这个错误和字符集看起来毫无关系。



















