PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告
Posted
技术标签:
【中文标题】PDO::__construct():服务器向客户端发送未知字符集 (255)。请向开发人员报告【英文标题】:PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers 【发布时间】:2017-09-12 05:53:27 【问题描述】:我正在尝试从 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 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;【参考方案2】:接受的答案救了我(谢谢,比尔!!!),但我遇到了另一个相关问题,只是想提供一些关于我的经历的细节 -
升级到 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';【参考方案3】:
我的情况是我使用 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 的连接运行良好。
请查看此图片以更好地理解。
【讨论】:
【参考方案4】:为我工作>
环境:
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/
【讨论】:
【参考方案5】:我也有这个问题。问题是因为我运行的是旧版本的 PHP (5.6),一旦升级到 PHP 7.4,错误就消失了。
这对我来说是在 Amazon Linux 2 上,升级命令是:
amazon-linux-extras 安装 php7.4
其他风格的 *nix 可能会在他们的存储库中包含它,否则如果您使用的是 Linux 风格,那么 Remi 可能会在这里为您提供它:https://rpms.remirepo.net/
【讨论】:
【参考方案6】:我遇到了同样的问题,所以我用不同的身份验证方法“使用传统身份验证方法(保留 MySQL 5.x 兼容性)”重新安装了 MySQL 8,它工作正常。
我建议,安装时选择第二种身份验证方法。
【讨论】:
【参考方案7】:在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【参考方案8】:在测试 mysql 和相关 php 系统的恢复备份时,我遇到了与此非常相似的问题。无论我在 mysql 上添加了什么配置设置,它都没有任何区别。在对问题进行一段时间的故障排除后,我在 mysql 日志中注意到 mysql 配置文件在很大程度上被 mysql 忽略了。原因是文件权限太开放,这是因为我的 zip 备份和恢复过程失去了所有文件权限。我修改了我的备份和恢复脚本,改为使用 tar,然后一切正常。
总而言之,检查您的 mysql 配置文件的文件权限是否正确。希望这对某人有所帮助。
【讨论】:
【参考方案9】:在我的 Aws Windows 中,我解决了它 和步骤是
-
打开“C:\ProgramData\MySQL\MySQL Server 8.0”
打开我的.ini
查找“[mysql]”
在“no-beep=" 刹车线后插入“default-character-set=utf8”
查找“[mysqld]”
插入“collation-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=
...
【讨论】:
【参考方案10】:我通过将以下代码添加到我的 /etc/my.cnf 文件中解决了这个问题 -
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
保存后,我进入我的系统设置并停止MYSQL服务器并重新启动,它工作。
【讨论】:
这与接受的答案完全相同【参考方案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: