PDOException: SQLSTATE[HY000] [2000]
mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.
Please use SET PASSWORD = PASSWORD('your_password') to update.
原因:MySQL 伺服器帳號仍使用舊 16 字元雜湊(pre-4.1 格式),而 mysqlnd(PHP 原生驅動)強制要求 41 字元新格式。
SELECT user, LENGTH(Password) FROM mysql.user;
+-------+------------------+
| user | LENGTH(Password) |
+-------+------------------+
| demo | 16 | -- 舊格式
| demo | 16 |
+-------+------------------+
demo 帳號為例):
UPDATE mysql.user SET Password = PASSWORD('demo') WHERE User = 'demo';
FLUSH PRIVILEGES;
SELECT user, LENGTH(Password) FROM mysql.user;
+-------+------------------+
| user | LENGTH(Password) |
+-------+------------------+
| demo | 41 |
| demo | 41 |
+-------+------------------+
my.cnf):
[mysqld]
old_passwords = 0
重啟 MySQL:systemctl restart mysqld。
PASSWORD() 函數在 MySQL 5.7.6+ 已移除,改用 ALTER USER 'user'@'host' IDENTIFIED BY 'pwd';(自動使用 caching_sha2_password 或 mysql_native_password)。old_passwords=1 並建立雙帳號,但強烈建議升級 PHP 並統一新格式。mysqlnd 優勢:非阻塞、記憶體效率高、支援 mysqli::reap_async_query 等進階功能,生產環境首選。#!/bin/bash
# fix_old_password.sh
USER=$1
PASS=$2
mysql -e "UPDATE mysql.user SET Password=PASSWORD('$PASS') WHERE User='$USER'; FLUSH PRIVILEGES;"
sed -i 's/^old_passwords.*/old_passwords=0/' /etc/my.cnf
systemctl restart mysqld