PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告

新手上路,请多包涵

我正在尝试从 Symfony 3 应用程序连接到 MySQL 数据库。但是当尝试从 Symfony 控制台命令创建 MySQL 模式时,我收到此错误: PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers

PHP 和 MySQL 都在 Docker 容器中运行。

MySQL版本: 8.0.1

PHP版本: 7.1.3

驱动程序: pdo_mysql

字符集: UTF8

dsn: "mysql:host=mysql;dbname=database;charset=UTF8;"

有任何想法吗?

原文由 Napas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

MySQL 8 将默认字符集更改为 utf8mb4。但是有些客户不知道这个字符集。因此,当服务器向客户端报告其默认字符集,并且客户端不知道服务器的含义时,它会抛出此错误。

另请参阅 https://bugs.mysql.com/bug.php?id=71606

该错误针对 MySQL 连接器/C++,因此它影响的不仅仅是 PHP。

好的 - 我通过将字符集更改为 utf8 来使其工作,以与未升级的客户端兼容。我将此添加到 /etc/my.cnf 并重新启动 mysqld:

 [client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8

我在 2010 年的回答中找到了这些设置: Change MySQL default character set to UTF-8 in my.cnf?

原文由 Bill Karwin 发布,翻译遵循 CC BY-SA 4.0 许可协议

我知道这是一个老问题,但本周我们不得不将旧的 PHP 5.3 + Apache Web 服务器工具迁移到 docker 容器,并被迫使用 php:5.6-apache。

由于我们不是所有者,因此我们无法更改 MySQL 远程服务器配置。

我们在 MySQL 8+ 服务器上连接 PHP 5.3 没有任何问题,所以我比较了 configs 和 php_info() 输出,并意识到 PHP 5.4+ 现在使用 ‘mysqlnd’ 作为内置默认驱动程序(本机)使用 mysql 或 mysqli 扩展连接到 MySQL 数据库。似乎 PHP 5.6 提供的 ‘mysqlnd’ 是问题所在。

我们修复它的方法是在我们的图像中安装 mysql-client 和 default-libmysqlclient-dev 包,这基本上是 MariaDb 的驱动程序,它能够连接到 MySQL 8+,并配置 PHP 以使用它而不是原生 mysqlnd 一个。

在 Dockerfile 中,我们首先安装:

 RUN apt update -y \
&& DEBIAN_FRONTEND=noninteractive apt install -y \
mysql-client \
default-libmysqlclient-dev

然后使用 php:5.6-apache 镜像的内置 docker-php-ext-* 脚本:

 RUN docker-php-ext-configure mysql --with-mysql=/usr/ \
&& docker-php-ext-install mysql \
&& docker-php-ext-configure mysqli --with-mysqli=/usr/bin/mysql_config \
&& docker-php-ext-install mysqli

我希望这将有助于社区。

谢谢。

原文由 Michael Tétreault 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题