MySQL 连接详解

连接MySQL数据库是使用MySQL的第一步。本章将详细介绍多种连接MySQL的方式,包括命令行连接和各种编程语言的连接方法。

使用 MySQL 命令行客户端连接

MySQL提供了命令行客户端工具,可以直接在终端或命令提示符中连接数据库服务器。

基本连接语法

mysql -h hostname -u username -p

连接参数说明

参数 描述 示例
-h--host MySQL服务器主机名 -h localhost-h 127.0.0.1
-u--user MySQL用户名 -u root-u myuser
-p--password 提示输入密码 -p(安全输入)
-P 端口号(默认3306) -P 3307
-D 要使用的数据库 -D mydatabase

连接实例

# 连接到本地MySQL服务器
mysql -u root -p

# 连接到远程MySQL服务器
mysql -h 192.168.1.100 -u myuser -p

# 连接到指定数据库
mysql -u root -p -D mydatabase

# 连接到指定端口
mysql -h localhost -P 3307 -u root -p

连接成功后,你会看到MySQL的命令提示符:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 8.0.33

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

退出MySQL客户端

mysql> exit
Bye

或者使用快捷键:Ctrl + D

使用 PHP 连接 MySQL

重要提醒: 原始的 mysql_connect() 函数在PHP 5.5.0中已废弃,在PHP 7.0.0中已移除。请使用MySQLi或PDO扩展。

使用 MySQLi 扩展连接

面向对象方式:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$database = "myDB";

// 创建连接
$conn = new mysqli($servername, $username, $password, $database);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "连接成功";

// 关闭连接
$conn->close();
?>

过程式方式:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$database = "myDB";

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $database);

// 检查连接
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}
echo "连接成功";

// 关闭连接
mysqli_close($conn);
?>

使用 PDO 扩展连接

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$database = "myDB";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
    // 设置PDO错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "连接成功";
} catch(PDOException $e) {
    echo "连接失败: " . $e->getMessage();
}

// 关闭连接
$conn = null;
?>

使用 Python 连接 MySQL

使用 mysql-connector-python

import mysql.connector
from mysql.connector import Error

try:
    connection = mysql.connector.connect(
        host='localhost',
        database='mydatabase',
        user='username',
        password='password'
    )

    if connection.is_connected():
        db_info = connection.get_server_info()
        print("成功连接到MySQL服务器,版本:", db_info)

except Error as e:
    print("连接MySQL时出错:", e)

finally:
    if connection.is_connected():
        connection.close()
        print("MySQL连接已关闭")

使用 PyMySQL

import pymysql

# 建立连接
connection = pymysql.connect(
    host='localhost',
    user='username',
    password='password',
    database='mydatabase',
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)

try:
    with connection.cursor() as cursor:
        # 执行SQL查询
        sql = "SELECT * FROM users"
        cursor.execute(sql)
        result = cursor.fetchall()
        print(result)

finally:
    connection.close()

使用 Java 连接 MySQL

使用 JDBC

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySQLConnection {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "username";
        String password = "password";

        try {
            // 加载MySQL JDBC驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 建立连接
            Connection connection = DriverManager.getConnection(url, username, password);
            System.out.println("成功连接到MySQL数据库");

            // 关闭连接
            connection.close();

        } catch (ClassNotFoundException e) {
            System.out.println("找不到MySQL JDBC驱动");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("连接MySQL数据库时出错");
            e.printStackTrace();
        }
    }
}

使用 Node.js 连接 MySQL

使用 mysql2 包

const mysql = require('mysql2');

// 创建连接
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'username',
    password: 'password',
    database: 'mydatabase'
});

// 连接数据库
connection.connect((err) => {
    if (err) {
        console.error('连接失败: ' + err.stack);
        return;
    }
    console.log('连接成功,连接ID: ' + connection.threadId);
});

// 执行查询
connection.query('SELECT 1 + 1 AS solution', (err, results) => {
    if (err) throw err;
    console.log('查询结果: ', results[0].solution);
});

// 关闭连接
connection.end();

使用连接池

const mysql = require('mysql2');

// 创建连接池
const pool = mysql.createPool({
    host: 'localhost',
    user: 'username',
    password: 'password',
    database: 'mydatabase',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

// 从连接池获取连接
pool.getConnection((err, connection) => {
    if (err) {
        console.error('获取连接失败: ' + err);
        return;
    }

    // 使用连接执行查询
    connection.query('SELECT * FROM users', (err, results) => {
        // 释放连接回连接池
        connection.release();

        if (err) {
            console.error('查询失败: ' + err);
            return;
        }
        console.log('查询结果: ', results);
    });
});

连接参数详解

常见连接参数

参数 描述 默认值
host MySQL服务器地址 localhost
port MySQL服务器端口 3306
user 用户名 -
password 密码 -
database 默认数据库 -
charset 字符集 utf8mb4
timeout 连接超时时间(秒) 30

连接字符串示例

# MySQL连接字符串格式
mysql://username:password@hostname:port/database

# 示例
mysql://root:mypassword@localhost:3306/mydatabase
mysql://user:pass@192.168.1.100:3307/production_db

连接错误处理

常见连接错误及解决方案

1. 连接被拒绝

ERROR 1045 (28000): Access denied for user 'username'@'localhost' (using password: YES)

解决方案:

  • 检查用户名和密码是否正确
  • 确认用户有连接权限
  • 检查用户的主机限制

2. 无法连接到服务器

ERROR 2003 (HY000): Can't connect to MySQL server on 'hostname' (111)

解决方案:

  • 检查MySQL服务是否运行
  • 确认主机名和端口正确
  • 检查防火墙设置
  • 验证网络连接

3. 未知数据库

ERROR 1049 (42000): Unknown database 'database_name'

解决方案:

  • 确认数据库存在
  • 检查数据库名称拼写
  • 用户是否有该数据库的访问权限

连接优化技巧

使用连接池

连接池可以显著提高应用程序的性能,特别是在高并发场景下。

设置合理的超时时间

// PHP MySQLi 连接选项
$conn = mysqli_init();
mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
mysqli_real_connect($conn, $host, $user, $pass, $db);

使用持久连接

// PDO 持久连接
$options = [
    PDO::ATTR_PERSISTENT => true
];
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass, $options);

字符集设置

// 设置字符集为utf8mb4(支持emoji等特殊字符)
$conn->set_charset("utf8mb4");

安全连接配置

使用SSL加密连接

// MySQLi SSL连接
$conn = mysqli_init();
mysqli_ssl_set($conn, NULL, NULL, '/path/to/ca.pem', NULL, NULL);
mysqli_real_connect($conn, $host, $user, $pass, $db);

安全的连接配置

  • 使用强密码并定期更换
  • 限制用户的连接主机
  • 使用SSL加密数据传输
  • 定期审计连接日志