MySQL - 创建数据库
MySQL - 创建数据库
Section titled “MySQL - 创建数据库”本教程将指导您在 MySQL 中创建新数据库。我们将涵盖 `CREATE DATABASE` 语句、指定字符集等基本最佳实践、使用 `IF NOT EXISTS` 子句以防止错误,以及如何从命令行和客户端应用程序创建数据库。在 MySQL 中存储和管理数据之前,您需要一个数据库作为表、视图和其他对象的容器。创建数据库通常是设置新项目或应用程序的第一步。
注意:您需要适当的管理权限(例如 CREATE 权限)才能创建数据库。如果您使用托管数据库服务,您可能会通过 Web 控制台而不是 SQL 来创建数据库。
CREATE DATABASE 语句
Section titled “CREATE DATABASE 语句”CREATE DATABASE 语句是一个 DDL(数据定义语言,Data Definition Language)命令,用于在 MySQL 服务器中创建一个新的空数据库。
CREATE DATABASE database_name;虽然这种方式可行,但它依赖于服务器的默认字符集和排序规则,这可能不是理想的选择。更好的做法是明确指定。
最佳实践:指定字符集和排序规则
Section titled “最佳实践:指定字符集和排序规则”为确保您的数据库能够正确存储和排序各种字符(包括国际文本和表情符号),强烈建议使用 utf8mb4 字符集和合适的排序规则,例如 utf8mb4_unicode_ci。
CREATE DATABASE my_new_appCHARACTER SET utf8mb4COLLATE 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 服务器本身的元数据、用户信息和性能指标。
使用 IF NOT EXISTS 防止错误
Section titled “使用 IF NOT EXISTS 防止错误”如果您尝试创建已存在名称的数据库,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 创建数据库
Section titled “使用 mysqladmin 创建数据库”对于系统管理员来说,mysqladmin 命令行工具提供了一种无需登录 MySQL 客户端即可从 shell 快速创建数据库的方法。
# -p 标志会提示您输入密码mysqladmin -u root -p create my_cli_app
Enter password: ********这对于脚本编写和服务器管理任务非常有用。
使用客户端程序创建数据库
Section titled “使用客户端程序创建数据库”应用程序安装脚本通常需要以编程方式创建数据库。以下是如何在不同语言中安全地执行此操作。请注意,数据库名称不能参数化,因此您在此处不使用预处理语句,但强大的错误处理仍然至关重要。
Node.js(使用 mysql2/promise)
Section titled “Node.js(使用 mysql2/promise)”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();Python(使用 mysql-connector-python)
Section titled “Python(使用 mysql-connector-python)”import mysql.connectorimport os
connection = Nonetry: # 连接到服务器,而不是特定的数据库 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(使用 PDO)
Section titled “PHP(使用 PDO)”<?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.");}?>