Skip to content

MySQL - 连接

要与 MySQL 数据库交互,客户端应用程序必须建立到服务器的连接。此过程需要提供凭据和连接详细信息。本教程涵盖了如何从命令行和各种编程语言安全地连接到 MySQL。

每个 MySQL 连接都需要以下核心参数:

  • 主机(Host):运行 MySQL 服务器的 IP 地址或主机名(例如,localhost、127.0.0.1 或远程 IP)。
  • 用户(User):您连接所用的数据库用户名(例如,root、app_user)。
  • 密码(Password):指定用户的密码。
  • 端口(Port):服务器监听的 TCP/IP 端口。默认是 3306。
  • 数据库(Database)(可选):连接后您要使用的特定数据库。

mysql 命令行工具是与服务器交互最直接的方式。它对于管理和调试至关重要。

mysql -h [hostname] -u [username] -P [port] -p [database_name]

-p 标志会安全地提示您输入密码。切勿直接在命令行中输入密码,如 -pYourPassword,因为它将显示在您的命令历史记录中。

要以 root 用户身份连接到本地服务器:

# 命令
mysql -u root -p
# 服务器将提示您输入密码
Enter password: ********

成功连接后,您将看到 mysql> 提示符。

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1234
Server version: 8.0.30
mysql>

要断开连接,请键入 exit 或 quit。

mysql> exit
Bye

root 密码通常在 MySQL 安装过程中设置。如果您需要更改它或任何其他用户的密码,请使用 ALTER USER 语句。

-- 以具有足够权限的用户身份连接(例如 root)
-- 然后执行此命令更改 root 用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'a-new-secure-password';

旧教程中的 SET PASSWORD 命令仍然有效,但 ALTER USER 是推荐的现代语法。

以下是从流行编程语言连接到 MySQL 的现代、安全示例。

警告:切勿将凭据(主机、用户、密码)直接硬编码到源代码中。这是一个重大的安全风险。相反,请从环境变量或专用的秘密管理服务(如 HashiCorp Vault 或 AWS Secrets Manager)加载它们。

PDO (PHP Data Objects) 提供了一个一致、安全的数据库访问接口。

<?php
// 从环境变量加载凭据
$host = getenv('DB_HOST') ?: '127.0.0.1';
$db = getenv('DB_NAME') ?: 'my_app_db';
$user = getenv('DB_USER') ?: 'app_user';
$pass = getenv('DB_PASS') ?: 'secret';
$port = getenv('DB_PORT') ?: '3306';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;port=$port;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "Connected to database successfully!";
} catch (\PDOException $e) {
// 在实际应用程序中,记录错误并显示通用消息
error_log($e->getMessage());
http_response_code(503);
die("Service unavailable. Please try again later.");
}
?>

mysql2 库是一个流行的、高性能的选择。将其与 promise 和 async/await 结合使用可以生成清晰、现代的代码。对于实际应用程序,请始终使用连接池。

import mysql from 'mysql2/promise';
// 在实际应用程序中,使用连接池
// const pool = mysql.createPool({ ...配置 });
async function testConnection() {
let connection;
try {
connection = await mysql.createConnection({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'app_user',
password: process.env.DB_PASS || 'secret',
database: process.env.DB_NAME || 'my_app_db'
});
console.log('Connected to MySQL successfully!');
// 您现在可以执行查询,例如 await connection.execute('SELECT 1');
} catch (error) {
console.error('Failed to connect to MySQL:', error);
} finally {
if (connection) {
await connection.end();
console.log('Connection closed.');
}
}
}
testConnection();