Skip to content

MySQL - 创建数据库

本教程将指导您在 MySQL 中创建新数据库。我们将涵盖 `CREATE DATABASE` 语句、指定字符集等基本最佳实践、使用 `IF NOT EXISTS` 子句以防止错误,以及如何从命令行和客户端应用程序创建数据库。

在 MySQL 中存储和管理数据之前,您需要一个数据库作为表、视图和其他对象的容器。创建数据库通常是设置新项目或应用程序的第一步。

注意:您需要适当的管理权限(例如 CREATE 权限)才能创建数据库。如果您使用托管数据库服务,您可能会通过 Web 控制台而不是 SQL 来创建数据库。

CREATE DATABASE 语句是一个 DDL(数据定义语言,Data Definition Language)命令,用于在 MySQL 服务器中创建一个新的空数据库。

CREATE DATABASE database_name;

虽然这种方式可行,但它依赖于服务器的默认字符集和排序规则,这可能不是理想的选择。更好的做法是明确指定。

最佳实践:指定字符集和排序规则

Section titled “最佳实践:指定字符集和排序规则”

为确保您的数据库能够正确存储和排序各种字符(包括国际文本和表情符号),强烈建议使用 utf8mb4 字符集和合适的排序规则,例如 utf8mb4_unicode_ci。

CREATE DATABASE my_new_app
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

此命令创建一个名为 my_new_app 的数据库,它已配置为支持现代多语言应用程序。

创建数据库后,您可以通过列出服务器上的所有数据库来验证其是否存在。

SHOW DATABASES;
Database
information_schema
my_new_app
mysql
performance_schema
sys

默认数据库(information_schema、mysql、performance_schema、sys)存储 MySQL 服务器本身的元数据、用户信息和性能指标。

如果您尝试创建已存在名称的数据库,MySQL 将返回错误。

CREATE DATABASE my_new_app;
-- ERROR 1007 (HY000): Can't create database 'my_new_app'; database exists

为了避免这种情况,尤其是在自动化脚本中,请使用 IF NOT EXISTS 子句。这会告诉 MySQL 仅在数据库不存在时才创建它,否则不执行任何操作并发出警告而不是错误。

CREATE DATABASE IF NOT EXISTS my_new_app;

对于系统管理员来说,mysqladmin 命令行工具提供了一种无需登录 MySQL 客户端即可从 shell 快速创建数据库的方法。

# -p 标志会提示您输入密码
mysqladmin -u root -p create my_cli_app
Enter password: ********

这对于脚本编写和服务器管理任务非常有用。

应用程序安装脚本通常需要以编程方式创建数据库。以下是如何在不同语言中安全地执行此操作。请注意,数据库名称不能参数化,因此您在此处不使用预处理语句,但强大的错误处理仍然至关重要。

require('dotenv').config();
const mysql = require('mysql2/promise');
async function createDatabase() {
// 首先连接,不指定具体数据库
let connection;
try {
connection = await mysql.createConnection({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASSWORD || 'password'
});
// 对数据库名称使用反引号,以防止名称是动态时发生 SQL 注入,尽管最好使用固定名称。
await connection.query(`CREATE DATABASE IF NOT EXISTS \`my_node_db\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`);
console.log('Database my_node_db created or already exists.');
} catch (error) {
console.error('Failed to create database:', error.message);
} finally {
if (connection) await connection.end();
}
}
createDatabase();
import mysql.connector
import os
connection = None
try:
# 连接到服务器,而不是特定的数据库
connection = mysql.connector.connect(
host=os.getenv('DB_HOST', 'localhost'),
user=os.getenv('DB_USER', 'root'),
password=os.getenv('DB_PASSWORD', 'password')
)
cursor = connection.cursor()
db_name = "my_python_db"
# 如果 db_name 来自用户输入,最安全的方法是根据白名单对其进行验证。
cursor.execute(f"CREATE DATABASE IF NOT EXISTS `{db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")
print(f"Database '{db_name}' created or already exists.")
except mysql.connector.Error as err:
print(f"Database error: {err}")
finally:
if connection and connection.is_connected():
cursor.close()
connection.close()
<?php
$host = $_ENV['DB_HOST'] ?? 'localhost';
$user = $_ENV['DB_USER'] ?? 'root';
$pass = $_ENV['DB_PASSWORD'] ?? 'password';
$charset = 'utf8mb4';
$db_name = "my_php_db";
// 不含数据库名称的连接字符串
$dsn = "mysql:host=$host;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
// 对数据库名称使用反引号很重要
$pdo->exec("CREATE DATABASE IF NOT EXISTS `{$db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
echo "Database '{$db_name}' created or already exists.\n";
} catch (\PDOException $e) {
error_log($e->getMessage());
throw new \RuntimeException("Could not connect to or create the database.");
}
?>