Laravel迁移服务器报错:Server sent charset unknown to the client
我之前迁移Laravel应用到新服务器时也碰到过完全一样的问题——明明数据库和应用配置都设了utf8和utf8_general_ci,但还是报这个字符集错误。下面是几个我试过的有效解决方案,你可以逐一排查:
1. 检查MySQL服务器的全局字符集配置
数据库层面的字符集设置可能被MySQL服务器的全局配置覆盖了。你需要登录新服务器的MySQL,执行以下命令查看全局字符集:
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
如果看到character_set_server或collation_server不是utf8/utf8_general_ci,需要修改MySQL的配置文件(Linux通常是/etc/my.cnf或/etc/mysql/my.cnf,Windows是my.ini),在[mysqld]段添加:
character-set-server=utf8 collation-server=utf8_general_ci
修改后一定要重启MySQL服务,再重新查看全局变量是否生效。
2. 在Laravel配置中添加连接初始化命令
有时候即使配置了charset和collation,数据库连接时的字符集协商还是会出问题。你可以在MySQL配置数组里添加options参数,强制设置连接字符集:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_general_ci', 'prefix' => '', 'strict' => false, 'engine' => null, 'options' => [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ], ],
添加后清空Laravel的配置缓存:
php artisan config:clear
3. 检查MySQL版本兼容性
如果新服务器的MySQL是8.0及以上版本,要注意MySQL 8.0对字符集的处理逻辑有细微变化——它默认的utf8实际是utf8mb3,部分旧驱动可能在协商字符集时出现不兼容。你可以尝试把配置里的charset改成utf8mb4,collation改成utf8mb4_general_ci,同时对应修改数据库的字符集(如果数据兼容的话),这也是现在更推荐的字符集设置方案。
4. 验证客户端连接字符集
你可以直接用MySQL客户端连接服务器,执行:
SHOW VARIABLES LIKE 'character_set_client'; SHOW VARIABLES LIKE 'character_set_connection';
看这两个值是不是utf8。如果不是,说明客户端连接时没有正确设置字符集,这时候上面的初始化命令就能起到强制修正的作用。
按照上面的步骤排查,应该能解决这个问题。
内容的提问来源于stack exchange,提问作者user3242861

