PHP使用Laravel框架连接Proxysql有时会出现乱码。

这种问题的出现一般是在PHP初始化连接的时候并没有设置正确的字符集,而在连接建立后使用Prepare Statement的方式设置字符集导致的。

Proxysql本身支持设置字符集(如,SET NAMES utf8mb4),但是对于用Prepare Statement设置字符集的方式支持的并不好,所以会导出出现乱码。

解决该问题可以参考一下两种方法:

  1. vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php中添加 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'
  2. vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php中将
1
2
3
4
5
6
7
protected function getHostDsn(array $config)
{
extract($config);
return isset($config['port'])
? "mysql:host={$host};port={$port};dbname={$database}"
: "mysql:host={$host};dbname={$database}";
}

修改为

1
2
3
4
5
6
7
protected function getHostDsn(array $config)
{
extract($config);
return isset($config['port'])
? "mysql:host={$host};port={$port};dbname={$database};charset=utf8mb4"
: "mysql:host={$host};dbname={$database};charset=utf8mb4";
}

参考文章:

https://github.com/sysown/proxysql/issues/780