PASSWORD
在 MySQL 服务器版本 8.0.12 中执行函数时出错
我有以下查询:
SELECT *
FROM users
WHERE login = 'FABIO'
AND pwd = PASSWORD('2018')
LIMIT 0, 50000
我收到此错误:
错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在附近使用的正确语法
如果您需要替换哈希来匹配 password() 函数,请使用:SHA1(UNHEX(SHA1())); 例如
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
和在版本 8 中给出相同答案的替换:
mysql> SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))));
+-------------------------------------------------+
| CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass'))))) |
+-------------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------------+
OP 的 MySQL 服务器版本是 8.0.12。从MySQL 文档中,版本 > 5.7.5不推荐使用PASSWORD函数:
笔记
本节中的信息仅适用于 MySQL 5.7.5 之前的版本,并且仅适用于使用 mysql_native_password 或 mysql_old_password 身份验证插件的帐户。MySQL 5.7.5 中删除了对 4.1 之前的密码哈希的支持。这包括删除 mysql_old_password 身份验证插件和 OLD_PASSWORD() 函数。此外,secure_auth 不能禁用,old_passwords 不能设置为 1。
从 MySQL 5.7.5 开始,只有关于 4.1 密码哈希和 mysql_native_password 身份验证插件的信息仍然相关。
取而代之的是,您可以从这里PASSWORD
使用更好、更安全的加密功能。可以在此处查看MySQL 服务器团队的更多详细信息。
使用 MySQL 8.0.22,我必须执行以下操作:
更新 /etc/mysql/my.cnf 并添加行:
[mysqld]
skip-grant-tables
重新启动 mysql 并运行一些查询:
> 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
您可以创建另一个类似于 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 ....