MySQL 选择数据库

在连接到MySQL服务器后,通常有多个数据库可供操作。选择正确的数据库是执行后续操作的前提。本章将详细介绍多种选择和切换数据库的方法。

选择数据库的基本方法

USE 命令语法

USE database_name;
提示: 选择数据库后,所有后续的SQL操作(如表创建、数据查询等)都将在该数据库上执行,直到切换到其他数据库。

从命令行选择MySQL数据库

登录时直接选择数据库

# 在连接时指定数据库
mysql -u username -p database_name

# 示例:连接到TUTORIALS数据库
[root@host]# mysql -u root -p TUTORIALS
Enter password: ******

登录后使用USE命令选择数据库

# 先连接到MySQL服务器
[root@host]# mysql -u root -p
Enter password: ******
-- 查看所有数据库
SHOW DATABASES;

-- 选择TUTORIALS数据库
USE TUTORIALS;

-- 确认当前选择的数据库
SELECT DATABASE();

完整示例流程

-- 登录MySQL后的完整操作示例
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| TUTORIALS          |
| company            |
| test               |
+--------------------+
7 rows in set (0.00 sec)

mysql> USE TUTORIALS;
Database changed

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| TUTORIALS  |
+------------+
1 row in set (0.00 sec)

使用 PHP 脚本选择数据库

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

使用 MySQLi 面向对象方式

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

// 创建连接并选择数据库
$conn = new mysqli($servername, $username, $password, $database);

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

// 也可以先连接,再选择数据库
$conn2 = new mysqli($servername, $username, $password);
if ($conn2->connect_error) {
    die("连接失败: " . $conn2->connect_error);
}

// 选择数据库
if ($conn2->select_db($database)) {
    echo "成功选择数据库: " . $database;
} else {
    echo "选择数据库失败: " . $conn2->error;
}

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

使用 MySQLi 过程式方式

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

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

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

// 选择数据库
if (mysqli_select_db($conn, $database)) {
    echo "成功选择数据库: " . $database;
} else {
    echo "选择数据库失败: " . mysqli_error($conn);
}

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

使用 PDO 方式

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

try {
    // PDO在连接时直接指定数据库
    $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
    // 设置PDO错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "成功连接到数据库: " . $database;

    // 如果需要切换数据库,可以使用USE语句
    $conn->exec("USE company");
    echo "已切换到数据库: company";

} catch(PDOException $e) {
    echo "错误: " . $e->getMessage();
}

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

使用 Python 选择数据库

使用 mysql-connector-python

import mysql.connector
from mysql.connector import Error

try:
    # 连接时直接指定数据库
    connection = mysql.connector.connect(
        host='localhost',
        user='username',
        password='password',
        database='TUTORIALS'
    )

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

except Error as e:
    print("错误:", e)

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

连接后切换数据库

import mysql.connector
from mysql.connector import Error

try:
    # 先连接到MySQL服务器
    connection = mysql.connector.connect(
        host='localhost',
        user='username',
        password='password'
    )

    if connection.is_connected():
        cursor = connection.cursor()

        # 查看所有数据库
        cursor.execute("SHOW DATABASES")
        print("可用数据库:")
        for db in cursor:
            print(f" - {db[0]}")

        # 选择数据库
        cursor.execute("USE TUTORIALS")
        print(f"已选择数据库: {connection.database}")

        # 或者使用select_db方法
        connection.database = 'company'
        print(f"已切换到数据库: {connection.database}")

except Error as e:
    print("错误:", e)

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

使用其他编程语言选择数据库

使用 Java (JDBC)

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

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

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

            // 建立连接
            Connection connection = DriverManager.getConnection(url, username, password);

            // 创建Statement并选择数据库
            Statement statement = connection.createStatement();
            statement.execute("USE TUTORIALS");
            System.out.println("数据库选择成功");

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

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

使用 Node.js

const mysql = require('mysql2');

// 创建连接时指定数据库
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'username',
    password: 'password',
    database: 'TUTORIALS'
});

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

// 或者连接后切换数据库
connection.changeUser({ database: 'company' }, (err) => {
    if (err) {
        console.error('切换数据库失败: ' + err);
    } else {
        console.log('已切换到数据库: company');
    }
});

connection.end();

查看数据库信息

查看所有数据库

-- 查看所有数据库
SHOW DATABASES;

-- 查看匹配特定模式的数据库
SHOW DATABASES LIKE 'test%';

查看当前选择的数据库

-- 查看当前数据库
SELECT DATABASE();

-- 或者使用status命令
STATUS;

查看数据库的详细信息

-- 查看数据库的创建信息
SHOW CREATE DATABASE database_name;

-- 查看数据库的字符集和排序规则
SELECT
    SCHEMA_NAME AS 'Database',
    DEFAULT_CHARACTER_SET_NAME AS 'Charset',
    DEFAULT_COLLATION_NAME AS 'Collation'
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';

权限验证和错误处理

检查数据库权限

-- 查看当前用户对特定数据库的权限
SHOW GRANTS FOR CURRENT_USER;

-- 查看用户是否有特定数据库的权限
SELECT * FROM information_schema.SCHEMA_PRIVILEGES
WHERE GRANTEE = "'username'@'host'"
AND TABLE_SCHEMA = 'database_name';

常见错误及解决方案

1. 数据库不存在

ERROR 1049 (42000): Unknown database 'database_name'

解决方案:检查数据库名称拼写,或先创建数据库。

2. 权限不足

ERROR 1044 (42000): Access denied for user 'username'@'localhost' to database 'database_name'

解决方案:请求管理员授予数据库访问权限。

3. 字符集不匹配

ERROR 1273 (HY000): Unknown collation: 'utf8mb4_unicode_ci'

解决方案:升级MySQL版本或修改数据库字符集。

最佳实践

连接管理

  • 在连接字符串中直接指定数据库,减少额外的选择操作
  • 及时关闭不再使用的数据库连接
  • 使用连接池管理数据库连接

错误处理

  • 始终检查数据库选择操作是否成功
  • 在生产环境中记录详细的错误信息
  • 实现适当的重试机制

安全性

  • 为应用程序使用专用的数据库用户
  • 遵循最小权限原则
  • 定期审计数据库访问权限

性能优化

  • 避免频繁切换数据库
  • 使用完全限定的表名(database.table)进行跨数据库查询
  • 合理设计数据库结构,减少跨数据库操作

实用技巧

在查询中指定数据库

-- 即使不在该数据库中,也可以查询其他数据库的表
SELECT * FROM other_database.table_name;

-- 跨数据库查询
SELECT
    u.name,
    o.order_date
FROM
    user_database.users u
    JOIN order_database.orders o ON u.id = o.user_id;

动态选择数据库

<?php
// 根据配置动态选择数据库
function connectToDatabase($dbName) {
    $config = [
        'host' => 'localhost',
        'username' => 'root',
        'password' => 'password'
    ];

    $conn = new mysqli($config['host'], $config['username'], $config['password']);
    if ($conn->connect_error) {
        return null;
    }

    if ($conn->select_db($dbName)) {
        return $conn;
    } else {
        $conn->close();
        return null;
    }
}

// 使用示例
$databases = ['TUTORIALS', 'company', 'test'];
foreach ($databases as $db) {
    $conn = connectToDatabase($db);
    if ($conn) {
        echo "成功连接到数据库: $db\n";
        // 执行操作...
        $conn->close();
    }
}
?>

备份当前数据库选择状态

<?php
// 保存当前数据库
function saveCurrentDatabase($conn) {
    $result = $conn->query("SELECT DATABASE() AS db");
    $row = $result->fetch_assoc();
    return $row['db'];
}

// 恢复到之前的数据信
function restoreDatabase($conn, $database) {
    if ($database) {
        return $conn->select_db($database);
    }
    return true;
}

// 使用示例
$originalDb = saveCurrentDatabase($conn);
// 执行需要切换数据库的操作...
restoreDatabase($conn, $originalDb);
?>