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

Posted

技术标签:

【中文标题】PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告【英文标题】:PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers 【发布时间】:2019-04-25 16:11:08 【问题描述】:

我正在尝试从 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;"

有什么想法吗?

【问题讨论】:

我遇到了类似的错误并升级到 PHP 7.4 来修复它。 我也遇到了与 docker PHP 7.1.3-fpm 映像类似的问题,已通过将其升级到 7.1.5 来解决 【参考方案1】:

我遇到了同样的问题,所以我用不同的身份验证方法“使用传统身份验证方法(保留 MySQL 5.x 兼容性)”重新安装了 MySQL 8,它工作正常。

我建议,安装时选择第二种身份验证方法。

【讨论】:

【参考方案2】:

我的情况是我使用 AWS 的 RDS(MySQL db 版本 8)并通过 EC2 连接我的应用程序(我的 php 代码 5.6 在 EC2 中)。

在这种情况下,因为它是 RDS,所以没有 my.cnf,参数由 AWS 的 PARAMETER Group 维护。参考:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

所以我做的是:

    创建了一个新的参数组,然后对其进行了编辑。

    搜索所有字符集参数。这些默认为空白。单独编辑它们并从下拉列表中选择 utf8。

character_set_client, 字符集连接, 字符集数据库, character_set_server

    保存

然后最重要的是,重新启动的 RDS 实例。

这解决了我的问题,并且从 php5.6 到 mysql 8.x 的连接运行良好。

请查看此图片以更好地理解。

【讨论】:

【参考方案3】:

在我的 Aws Windows 中,我解决了它 和步骤是

    打开“C:\ProgramData\MySQL\MySQL Server 8.0” 打开我的.ini 查找“[mysql]” 在“no-beep=" 刹车线后插入“default-character-set=utf8” 查找“[mysqld]” 插入“collat​​ion-server = utf8_unicode_ci” 插入“character-set-server = utf8”

例子

...
# socket=MYSQL

port=3306

[mysql]
no-beep=
default-character-set=utf8
# default-character-set=

# SERVER SECTION
# ----------------------------------------------------------------------
# 
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this 
# file.=
# 
# server_type=2
[mysqld]

collation-server = utf8_unicode_ci
character-set-server = utf8
# The next three options are mutually exclusive to SERVER_PORT below.
# skip-networking=
# enable-named-pipe=
# shared-memory=
...

【讨论】:

【参考方案4】:

我也有这个问题。问题是因为我运行的是旧版本的 PHP (5.6),一旦升级到 PHP 7.4,错误就消失了。

这对我来说是在 Amazon Linux 2 上,升级命令是:

amazon-linux-extras 安装 php7.4

其他风格的 *nix 可能会在他们的存储库中包含它,否则如果您使用的是 Linux 风格,那么 Remi 可能会在这里为您提供它:https://rpms.remirepo.net/

【讨论】:

【参考方案5】:

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?

【讨论】:

它在我的环境中工作。 MySQL 8.0.1,PHP 7.1.4。你重启mysql服务了吗? 仅供参考:bugs.php.net/bug.php?id=74461 请参阅 nikic 的评论,显然这已在 PHP 源代码中修复,我认为它将在不久的将来发布。 我已经 dockerized 应用程序。将该配置放入 /etc/mysql/conf.d 解决了错误。谢谢。 如果正在运行,请停止 mysql 服务器,按照答案中的说明进行操作,然后重新启动 mysql 服务器。这种方式对我有用。 在我尝试这个答案之前,我也在 mysql 中运行过这个,在终端中使用正确的 dbname 首先运行这个:[1] > mysql -u root -p [2] > ALTER DATABASE dbname字符集 utf8 整理 utf8_general_ci;【参考方案6】:

在测试 mysql 和相关 php 系统的恢复备份时,我遇到了与此非常相似的问题。无论我在 mysql 上添加了什么配置设置,它都没有任何区别。在对问题进行一段时间的故障排除后,我在 mysql 日志中注意到 mysql 配置文件在很大程度上被 mysql 忽略了。原因是文件权限太开放,这是因为我的 zip 备份和恢复过程失去了所有文件权限。我修改了我的备份和恢复脚本,改为使用 tar,然后一切正常。

总而言之,检查您的 mysql 配置文件的文件权限是否正确。希望这对某人有所帮助。

【讨论】:

【参考方案7】:

我通过将以下代码添加到我的 /etc/my.cnf 文件中解决了这个问题 -

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


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

保存后,我进入我的系统设置并停止MYSQL服务器并重新启动,它工作。

【讨论】:

这与接受的答案完全相同【参考方案8】:

接受的答案救了我(谢谢,比尔!!!),但我遇到了另一个相关问题,只是想提供一些关于我的经历的细节 -

升级到 MySQL 8.0.11 后,我在使用 PHP 的 mysqli_connect() 函数时遇到了与 OP 相同的问题。在我的 MySQL 目录(在我的例子中,usr/local/mysql)中,我创建了my.cnf 文件,在接受的答案中添加了内容,然后重新启动了 MySQL 服务器。但是,这产生了一个新错误:

mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password]

我添加了default_authentication_plugin = mysql_native_password 行,所以my.cnf 现在看起来像:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

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

我很高兴去!

更多参考:https://github.com/laradock/laradock/issues/1392

【讨论】:

请注意,您应该创建新用户并明确指定“IDENTIFIED WITH mysql_native_password”,并更改现有用户,例如:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; 当然使用你的密码:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourrootpassword';请注意:my.cnf 中身份验证方法的更改将恢复为旧的密码哈希系统,强烈建议不要 在我发布后终于工作了:ALTER USER root@'%' IDENTIFIED WITH mysql_native_password BY 'secretpassword';【参考方案9】:

为我工作>

环境:

localhost
Windows 10
PHP 5.6.31
MYSQL 8

设置:

default-character-set=utf8

开:

c:\programdata\mysql\mysql 服务器 8.0\my.ini

不适用于> C:\Program Files\MySQL\MySQL Server 5.5\my.ini

有用的工具:

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -p

mysql> show variables like 'char%';

mysql> show variables like 'collation%';

\m/

【讨论】:

【参考方案10】:

php.ini 中找到[MySQLi] 部分并添加行mysqli.default_charset = "UTF-8"。我需要对[Pdo_mysql][mysqlnd] 部分进行类似的更改。

问题似乎与 MySQL 8.0 版有关,发现上述解决方案适用于 PHP 7.2 版,而解决方案不适用于 PHP 7.0

【讨论】:

mysqli.default_charset 没有记录在php.net/manual/en/mysqli.configuration.php【参考方案11】:

我在连接到本地系统时遇到了同样的问题。

我检查了服务列表 (Run->Services.msc->Enter) wampmysqld64 已停止。

重新启动它。并且能够登录。

【讨论】:

以上是关于PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告的主要内容,如果未能解决你的问题,请参考以下文章

PDOException::("PDO::__construct(): 使用 MySQL 8 / PHP 7.2 / Laravel 进行缓存_sha2 auth: 109 时出现意外的服务

PDO::__construct(): 发送 108 字节失败,errno=32 Broken pipe

警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

PDO::__construct(): php_network_getaddresses: getaddrinfo failed: nodename or servname provided, or

PDO连接mysql8.0报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to

[PDOException] PDO::__construct(): php_network_getaddresses: getaddrinfo failed: