解决PHP连接Proxysql出现乱码的问题

2017/11/21 posted in  ProxySQL
Tags: 

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中将

    protected function getHostDsn(array $config)
    {
    extract($config);
    return isset($config['port'])
    ? "mysql:host={$host};port={$port};dbname={$database}"
    : "mysql:host={$host};dbname={$database}";
    }

    修改为

    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