在MySQL Server版本8.0.12中执行PASSWORD
函数时出现错误。
我有以下查询:
SELECT *
FROM users
WHERE login = 'FABIO'
AND pwd = PASSWORD('2018')
LIMIT 0, 50000
我遇到了这个错误:
错误代码:1064。您的SQL语法有误,请查看与您的MySQL服务器版本相对应的手册,以获取正确的语法
在MySQL Server版本8.0.12中执行PASSWORD
函数时出现错误。
我有以下查询:
SELECT *
FROM users
WHERE login = 'FABIO'
AND pwd = PASSWORD('2018')
LIMIT 0, 50000
我遇到了这个错误:
错误代码:1064。您的SQL语法有误,请查看与您的MySQL服务器版本相对应的手册,以获取正确的语法
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
并且在版本8中能够给出与替代物相同的答案:
mysql> SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))));
+-------------------------------------------------+
| CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass'))))) |
+-------------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------------+
PASSWORD(...)
会产生一个带有一个前置星号的字符串。 - tom_mai78101更新 /etc/mysql/my.cnf 文件并添加以下内容:
[mysqld]
skip-grant-tables
重启 MySQL 并清除特定用户的 authentication_string:
> systemctl restart mysql
> sudo mysql
mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
FLUSH PRIVILEGES;
mysql> exit;
重新登录并更新密码:
> mysql -u root
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'my password';
mysql> FLUSH PRIVILEGES;
更新 /etc/mysql/my.cnf 文件并删除 skip-grant-tables
行:
> systemctl restart mysql
最后,测试:
> mysql -u root -p
OP 的 MySQL 服务器版本是 8.0.12。从 MySQL 文档 可知,版本 > 5.7.5 的 PASSWORD 函数已被弃用:
注
本节中的信息仅适用于 MySQL 5.7.5 版本之前,仅适用于使用 mysql_native_password 或 mysql_old_password 身份验证插件的帐户。在 MySQL 5.7.5 中删除了对 pre-4.1 密码哈希的支持。这包括删除mysql_old_password 身份验证插件和 OLD_PASSWORD() 函数。此外,不能禁用 secure_auth ,也不能将 old_passwords 设置为 1。
从 MySQL 5.7.5 开始,只有关于 4.1 密码哈希和 mysql_native_password 身份验证插件的信息仍然相关。
相比于 PASSWORD
函数,你可以从这里使用更好且更安全的加密函数。有关 MySQL 服务器团队的更多详细信息,请参见此处。
你可以创建一个类似于PASSWORD的函数
SET GLOBAL log_bin_trust_function_creators = 1;
delimiter $$
CREATE FUNCTION PASSWORD2 (pass_in varchar(50)) RETURNS varchar(50)
BEGIN
declare n_pass varchar(50);
set n_pass = CONCAT('*', UPPER(SHA1(UNHEX(SHA1(pass_in)))));
return n_pass;
END$$
那么
SELECT PASSWORD2("my_super_scret_password") FROM MyUserTable ....