MySQL - 修改密码



MySQL 为每个用户提供一个帐户,该帐户使用用户名和密码进行身份验证。MySQL 中的默认帐户是 root,没有密码(但是,可以使用语句为 root 设置密码)。类似地,其他用户定义的帐户可以显式使用 SQL 语句设置密码,也可以由 MySQL 系统生成。

MySQL 更改用户密码

与任何其他经过身份验证的帐户一样,MySQL 也有更改用户密码的规定。但是,必须确保当前没有应用程序被用户使用。如果在不断开应用程序连接的情况下重置密码,则应用程序无法再次通过此用户连接到服务器。

我们可以使用以下三个 SQL 语句更改 MySQL 用户帐户的密码:

  • UPDATE 语句

  • SET PASSWORD 语句

  • ALTER USER 语句

UPDATE 语句

在 MySQL 中更改用户密码的最基本方法是使用 UPDATE 语句。此语句用于更新帐户详细信息,包括来自“root”帐户的帐户密码。但是,一旦使用此语句完成修改,就必须使用 FLUSH PRIVILEGES 语句从 MySQL 数据库的 grant 表中重新加载权限。

语法

以下是使用 UPDATE 语句更改密码的语法:

UPDATE mysql.user 
SET authentication_string = PASSWORD(password_string)
WHERE User = user_name AND 
      Host = host_name
FLUSH PRIVILEGES;

示例

以下示例演示了如何使用 UPDATE 语句更改用户帐户的密码。首先,我们使用密码“123456”创建一个用户帐户“sample”:

CREATE USER 'sample'@'localhost' IDENTIFIED BY '123456';

获得以下输出:

Query OK, 0 rows affected (0.02 sec)

现在,您可以使用以下查询验证用户列表:

SELECT User FROM mysql.user;

表将显示如下:

用户
mysql.infoschema
mysql.session
mysql.sys
root
sample

如果您使用的是 MySQL 5.7.6 及更高版本,则可以使用以下查询直接修改 mysql.user 表:

UPDATE user
SET authentication_string = PASSWORD('xxxxxx')
WHERE User = 'sample' AND Host = 'localhost';

执行上述代码后,我们得到以下输出:

Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

更改用户帐户后,需要使用 FLUSH PRIVILEGES 语句立即应用这些更改:

FLUSH PRIVILEGES;

获得的输出如下所示:

Query OK, 0 rows affected (0.01 sec)

SET PASSWORD 语句

SET PASSWORD 语句用于为 MySQL 帐户设置密码。它包含一个“密码验证”子句,让系统知道当前用户密码需要替换为其他密码。

语法

以下是 SET PASSWORD 语句的语法:

SET PASSWORD FOR username@localhost = password_string;

您也可以在不使用 FOR 子句的情况下使用 SET PASSWORD 更改密码。但是,要使用此语法,您必须已登录到您希望更改其密码的用户帐户:

SET PASSWORD = password_string;

示例

现在,使用 SET PASSWORD 语句,我们将密码更改为“hello”:

SET PASSWORD = 'hello';

输出

以下是上述代码的输出:

Query OK, 0 rows affected (0.01 sec)

ALTER USER 语句

要更改 MySQL 中用户帐户的任何内容,包括更改密码,ALTER USER 语句比 SET PASSWORD 语句更可取。此语句不会单独使用,而是后面跟着 IDENTIFIED BY 子句来验证新密码。

请注意,用户必须连接到 MySQL 服务器才能使此语句生效。

语法

以下是使用 ALTER USER 语句更改密码的语法:

ALTER USER username IDENTIFIED BY 'password';

示例

这里,我们使用下面给出的 ALTER USER 查询将 sample@localhost 帐户的密码更改为“000000”:

ALTER USER sample@localhost IDENTIFIED BY '000000';

输出

以下显示了上述代码的输出:

Query OK, 0 rows affected (0.01 sec)

密码现已更改。要进行验证,请使用新密码再次登录到 sample 帐户:

C:\Windows\System32> mysql -u sample -p
Enter password: ******

mysql> 

使用客户端程序更改用户密码

除了使用 MySQL 查询在 MySQL 中更改用户密码外,我们还可以使用 Node.js、PHP、Java 和 Python 等客户端程序来实现相同的结果。

语法

以下是语法:

要更改用户的 MySQL 数据库密码,我们需要使用此函数执行 ALTER USER 语句,如下所示:

$sql = "ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'";
$mysqli->query($sql);

要更改用户的 MySQL 密码,我们需要使用名为 query() 的函数执行 ALTER USER 语句,如下所示:

sql= "ALTER USER username IDENTIFIED BY 'new_password'";
con.query(sql, function (err, result) {
   if (err) throw err;
      console.log(result);
});

要更改用户的 MySQL 数据库密码,我们需要使用 JDBC execute() 函数执行 ALTER USER 语句,如下所示:

String sql = "ALTER USER 'USER_NAME'@'LOCALHOST' IDENTIFIED BY 'NEW_PASSWORD'";
statement.execute(sql);

MySQL Connector/Python 提供了一个名为 execute() 的函数,用于在 MySQL 数据库中执行 SQL 查询。要更改 MySQL 数据库中用户的密码,我们需要使用此函数执行 ALTER USER 语句,如下所示:

sql = f"ALTER USER '{username_to_change}'@'localhost' IDENTIFIED BY '{new_password}'";
cursorObj.execute(sql);

示例

以下是更改 MySQL 中用户密码的客户端程序:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass);
   if($mysqli->connect_errno ) {
     printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "ALTER USER 'root'@'localhost' IDENTIFIED BY 'password1'"; if($mysqli->query($sql)){ printf("User password has been changed successfully...!"); } if($mysqli->error){ printf("Failed..!" , $mysqli->error); } $mysqli->close();

输出

获得的输出如下所示:

Your password has been changed successfully...!
var mysql = require('mysql2');
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "Nr5a0204@123"});

  //Connecting to MySQL
  con.connect(function (err) {
  if (err) throw err;
  console.log("Connected!");
  console.log("--------------------------"); 

  //Listing the users
  sql = "SELECT USER FROM mysql.user;"
  con.query(sql, function(err, result){
    if (err) throw err
    console.log("**List of Users:**")
    console.log(result)
    console.log("--------------------------");
  }); 

  sql = "ALTER USER 'sample'@'localhost' IDENTIFIED BY 'tutorials';";
  con.query(sql, function(err){
    if (err) throw err;
    console.log("Password changed Successfully...");
  });
  sql = "FLUSH PRIVILEGES;"
  con.query(sql);
});

输出

产生的输出如下所示:

Connected!
--------------------------
**List of Users:**
[
  { USER: 'mysql.infoschema' },
  { USER: 'mysql.session' },
  { USER: 'mysql.sys' },
  { USER: 'root' },
  { USER: 'sample' }
]
--------------------------
Password changed Successfully...
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class ChangePassword {
	public static void main(String[] args) {
		String url = "jdbc:mysql://127.0.0.1:3306/TUTORIALS";
		String user = "root";
		String password = "password";
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, password);
            Statement st = con.createStatement();
            //System.out.println("Database connected successfully...!");
            String sql = "ALTER USER 'root'@'localhost' IDENTIFIED BY 'password1'";
            st.execute(sql);
            System.out.println("User 'root' password changed successfully...!");    
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

输出

获得的输出如下所示:

User 'root' password changed successfully...!
import mysql.connector
# creating the connection object
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password'
)
username_to_change = 'newUser'
new_password = 'passwordSet!'
# Create a cursor object for the connection
cursorObj = connection.cursor()
cursorObj.execute(f"ALTER USER '{username_to_change}'@'localhost' IDENTIFIED BY '{new_password}'")
print(f"Password for user '{username_to_change}' changed successfully.")
cursorObj.close()
connection.close()

输出

以下是上述代码的输出:

Password for user 'newUser' changed successfully.
广告