必须让laravel连接层、mysql服务端、数据库/表/字段、phpmyadmin界面四者字符集完全统一为utf8mb4,缺一环就出???或报错sqlstate[hy000]: general error: 1366;需同步配置my.cnf、config/database.php、config.inc.php,并在迁移中显式声明utf8mb4 collation。

要让Laravel写入的中文、emoji在phpMyAdmin里正常显示不乱码,必须让Laravel连接层、MySQL服务端、数据库/表/字段、phpMyAdmin界面四者字符集完全统一为utf8mb4,缺一环就出???或报错SQLSTATE[HY000]: General error: 1366。
确认MySQL服务端已启用utf8mb4
先登录phpMyAdmin,执行SQL:SHOW VARIABLES LIKE 'character_set_server'; 和 SHOW VARIABLES LIKE 'collation_server';。若返回值不是utf8mb4和utf8mb4_unicode_ci,说明服务端没配好。
编辑MySQL配置文件(Linux下/etc/mysql/my.cnf,Windows下C:\ProgramData\MySQL\MySQL Server X.X\my.ini),在[mysqld]段落添加:
character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci
重启MySQL服务后,再次运行SHOW VARIABLES命令验证——【character_set_server和collation_server必须同时为utf8mb4】,否则后续所有操作都白搭。
Laravel连接层强制设utf8mb4
仅改.env里的DB_CHARSET=utf8mb4无效,Laravel官方配置根本不读这个变量。
打开config/database.php,找到'mysql'配置块,在其中加入三行:
'charset' => 'utf8mb4','collation' => 'utf8mb4_unicode_ci','options' => [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"]
这一步必须做,否则Laravel 8+在某些PDO版本下仍会走默认utf8连接,导致emoji存进去变???——【PDO初始化命令不可省略】。
phpMyAdmin界面与连接默认编码设置
打开phpMyAdmin安装目录下的config.inc.php文件。
查找$cfg['DefaultCharset'],将其设为'utf8mb4';再查找$cfg['DefaultConnectionCollation'],设为'utf8mb4_unicode_ci'。
如果这两项不存在,直接在文件末尾追加:
$cfg['DefaultCharset'] = 'utf8mb4';$cfg['DefaultConnectionCollation'] = 'utf8mb4_unicode_ci';
保存后重启Web服务器(Apache/Nginx),否则新设置不生效。
创建或修正数据库与表字符集
方法一:新建数据库时指定
在phpMyAdmin左侧导航栏点击“新建”,输入数据库名,下方“排序规则”下拉框选择utf8mb4_unicode_ci,点击创建。
方法二:已有数据库升级
选中目标数据库 → 点击“操作”选项卡 → 在“排序规则”下拉框中选utf8mb4_unicode_ci → 点击“执行”。
方法三:批量修正所有表
进入该数据库 → 执行SQL:ALTER DATABASE `your_db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
然后逐个选中数据表 → “操作” → “更改表” → 将“排序规则”改为utf8mb4_unicode_ci → 执行。对大表建议用命令行分批处理,避免phpMyAdmin超时中断。
Laravel迁移中确保字段级utf8mb4生效
第一步:在AppServiceProvider::boot()中加入
Schema::defaultStringLength(191);
第二步:迁移文件中显式声明字段collation
例如:$table->string('title')->collation('utf8mb4_unicode_ci'); 或 $table->text('content')->collation('utf8mb4_bin');
第三步:运行迁移前先预览SQL
php artisan migrate --pretend,确认输出中每条CREATE TABLE语句末尾都带ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,且每个VARCHAR字段后都有COLLATE utf8mb4_unicode_ci。
若没有,说明Laravel未穿透到列级——此时必须用DB::statement()手动补全,比如在迁移up()方法末尾加:DB::statement("ALTER TABLE posts MODIFY title VARCHAR(255) COLLATE utf8mb4_unicode_ci");
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











