更新:
23.02.2020:该错误已在PHP 7.4.3中修复。
23.12.2019:我发现了哪些密码受到影响。请看下面我的回答。仍然非常感谢为什么拒绝长密码的答案。
免责声明:我已经尝试了大约 2 个小时,只是设置了不同的密码。我绝对相信下面的密码会导致问题。它适用于其他密码。我确实知道如何解决它:使用不同的密码。我想知道为什么它不起作用。因为这样的不一致是不可接受的。
我能够在我的系统上重现该问题。
最近切换到 PHP 7.4 和 MySQL 8,默认使用caching_sha2_password
. 在验证它实际上受 PHP 支持后,我无法让它与我随机生成的密码一起使用,所以我mysql_native_password
再次使用 PHP 7.3。
现在,我设置了一个新服务器并且它工作正常,所以我试图找出问题所在,以便我可以caching_sha2_password
在我的其他服务器上使用。
MySQL(通过 mysql shell 使用root
)
ALTER USER 'test'@'localhost' IDENTIFIED WITH caching_sha2_password BY '';
FLUSH PRIVILEGES;
QUIT
PHP
const DB_HOST = '127.0.0.1';
const DB_USERNAME = 'test';
const DB_PASSWORD = '';
const DB_NAME = 'test_db';
$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
测试(重现)
php db.php
错误
PHP 警告:mysqli::__construct(): (HY000/1045): Access denied for user 'test'@'localhost' (using password: YES) in /db.php on line 5
解决方法:有趣的是,由于某些疯狂的原因,再次运行此修复程序:
mysql -u test -p
# Enter password
QUIT
重新设置密码再次引入了问题。
我注意到它根据我使用的密码失败了。所以我认为这可能是不支持的字符或粘贴问题。
我将我的原始密码(40 个字符)归结为这个(20 个字符):
这个密码打破了它:l0QDEptp*L6tNo28ey^8
所有较短的组合都可以正常工作:此密码例如有效:l0QDEptp*L6tNo28ey^
以及此密码:0QDEptp*L6tNo28ey^8
重要提示:仅在安全环境中测试此公共密码!
如果您能够重现该问题或对此有任何想法(解决方案/可能的原因),请告诉我。
注意:这个问题实际上发生在我所有随机生成的密码上,这些密码有 40 个字符长并且包含特殊字符(例如:%^$!)。我猜一些相对常见的组合会触发这个问题。
图片: 演示
MySQL 版本: mysql Ver 8.0.18-0ubuntu0.19.10.1 for Linux on aarch64 ((Ubuntu))
PHP 版本: PHP 7.4.1 (cli) (built: Dec 18 2019 14:44:55) (NTS)
PHP Bug报告: 这里
MySQL 错误报告: 这里