MySQL: 入门指南
如何开始使用 MySQL
👋 欢迎来到 Stackhero 文档!
Stackhero 提供了一种即用型 MySQL 云 解决方案,具有众多优势,包括:
- 无限连接和传输。
- 包含 phpMyAdmin 网络界面。
- 只需点击即可轻松完成 更新。
- 通过 专用私有 VM 提供最佳 性能 和强大 安全性。
节省时间并简化生活:只需 5 分钟即可试用 Stackhero 的 MySQL 云托管 解决方案!
MySQL URL
如果您希望快速连接到您的 MySQL 服务,并且您的驱动程序支持该格式,可以使用 MySQL URL 格式:
mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
如果您使用 Ruby,URL 格式略有不同:
mysql2://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?reconnect=true&useSSL=true&requireSSL=true
在 PHP 中使用 MySQL
MySQLi(面向对象风格)
以下是使用 PHP 的 MySQLi 扩展以面向对象方式连接 MySQL 的示例:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // 虽然本示例使用 "root" 数据库,但建议您通过 phpMyAdmin 为应用创建专用数据库和用户。
$mysqli = mysqli_init();
$mysqliConnected = $mysqli->real_connect($hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
die("连接错误: " . $mysqli->connect_error);
}
echo '连接成功... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
MySQLi(过程化风格)
如果您更喜欢过程化代码,可以按如下方式使用 MySQLi 过程化风格进行连接:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // 为了最佳安全性,请在 phpMyAdmin 中创建专用数据库和用户,而不是直接使用 "root"。
$mysqli = mysqli_init();
$mysqliConnected = mysqli_real_connect($mysqli, $hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
die("连接错误: " . mysqli_connect_error($mysqli));
}
echo '成功: ' . mysqli_get_host_info($mysqli) . "\n";
mysqli_close($mysqli);
?>
PDO
如果您更喜欢使用 PDO 访问数据库,以下是一个连接示例:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // 建议为您的应用创建专用数据库和用户。
$dsn = "mysql:host=$hostname;port=$port;dbname=$database";
$options = array(
// 如果连接时遇到 SSL 相关错误,请确保系统已安装正确的 CA 证书(见下文)。
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
// PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
);
$pdo = new PDO($dsn, $user, $password, $options);
$stm = $pdo->query("SELECT VERSION()");
$version = $stm->fetch();
echo "您已连接到运行版本为 " . $version[0] . " 的数据库\n";
?>
故障排查:SSL operation failed with code 1
如果您看到如下错误:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
这通常是因为您的系统在 /etc/ssl/certs/ 目录下缺少 CA 证书。
如果您有权限访问运行 PHP 代码的系统,可以通过以下方式安装证书:
- 在 Ubuntu/Debian 上运行:
sudo apt-get install ca-certificates - 在 Alpine Linux 上运行:
apk add ca-certificates
如果您无法直接访问系统,可以手动添加证书:
- 下载证书:https://letsencrypt.org/certs/isrgrootx1.pem
- 将
isrgrootx1.pem文件放入您的 PHP 项目中。 - 注释掉
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'这一行 - 取消注释
PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'这一行
解决 PDO 未定义常量错误
如果您遇到如下错误:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH
或类似信息,这说明 PDO 安装时未包含 MySQL 支持。
- 在 Ubuntu/Debian 上
可以通过以下命令安装所需扩展:
sudo apt-get install php-mysql
- 在 Docker 环境下
如果您使用 Docker,请确保在构建镜像时包含 MySQL 支持。可在 Dockerfile 中添加:
RUN docker-php-ext-install pdo pdo_mysql
### 在 Symfony 和 Doctrine 中使用 MySQL
如果您在使用 Symfony 和 Doctrine,可以按如下方式配置连接:
1. 编辑 `.env` 文件,设置 `DATABASE_URL` 变量:
DATABASE_URL="mysql://<USER>:<PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/<DATABASE>"
1. 然后在 `config/packages/doctrine.yaml` 中设置驱动和选项:
```yaml
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
options:
# PDO::MYSQL_ATTR_SSL_CAPATH
1010: '/etc/ssl/certs'
# PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
1014: true
故障排查:SSL operation failed with code 1
如果遇到如下错误:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
这通常是因为 /etc/ssl/certs/ 目录下缺少 CA 证书。
如果您有权限访问系统,可以按如下方式安装:
- 在 Ubuntu/Debian 上:
sudo apt-get install ca-certificates - 在 Alpine Linux 上:
apk add ca-certificates
如果无法直接访问系统,可以手动添加证书:
- 下载:https://letsencrypt.org/certs/isrgrootx1.pem
- 将
isrgrootx1.pem放入您的 Symfony 项目中。 - 更新
config/packages/doctrine.yaml:
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
options:
# PDO::MYSQL_ATTR_SSL_CA
1009: 'isrgrootx1.pem'
# PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
1014: true
在 Laravel 中使用 MySQL
要在 Laravel 中配置 MySQL,请打开 config/database.php 并更新 MySQL 部分:
'mysql' => [
'driver' => 'mysql',
'host' => env('STACKHERO_MYSQL_HOST'),
'port' => env('STACKHERO_MYSQL_PORT'),
'username' => env('STACKHERO_MYSQL_USER'),
'password' => env('STACKHERO_MYSQL_PASSWORD'),
'database' => env('STACKHERO_MYSQL_USER'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'sslmode' => 'require',
'options' => extension_loaded('pdo_mysql')
? array_filter([
// 有关 SSL 错误,请参见上方故障排查部分。
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
// PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
])
: [],
],
在 PHP CodeIgniter 中使用 MySQL
在 database.php 配置文件中,您可以添加如下内容:
$db['default'] = array(
'hostname' => getenv('STACKHERO_MYSQL_HOST'),
'port' => getenv('STACKHERO_MYSQL_PORT'),
'username' => getenv('STACKHERO_MYSQL_USER'),
'password' => getenv('STACKHERO_MYSQL_PASSWORD'),
'database' => getenv('STACKHERO_MYSQL_USER'), // 按惯例,数据库名与用户名一致。
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => true,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'encrypt' => array() // 重要:启用 TLS 加密
);
在 PHP 中通过环境变量连接
通常建议不要将数据库凭据直接写入代码,而是使用环境变量。您可以这样获取:
$hostname = getenv('STACKHERO_MYSQL_HOST');
$port = getenv('STACKHERO_MYSQL_PORT');
$user = getenv('STACKHERO_MYSQL_USER');
$password = getenv('STACKHERO_MYSQL_PASSWORD');
$database = getenv('STACKHERO_MYSQL_USER'); // 按惯例,数据库名与用户名一致。
在 WordPress 中使用 MySQL
将 WordPress 连接到 Stackhero for MySQL 非常简单。只需按如下方式编辑您的 wp-config.php 文件:
define('DB_HOST', '<XXXXXX>.stackhero-network.com');
define('DB_PORT', '<PORT>');
define('DB_NAME', 'root');
define('DB_USER', 'root');
define('DB_PASSWORD', '<yourPassword>');
// 启用 TLS 加密(也称为 SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
关键步骤是启用 TLS(SSL)加密。否则,您的连接将无法正常工作。
在 Node.js 中使用 MySQL
MySQL X 协议(xdevapi 包)
要使用 MySQL X 协议,可以安装官方 xdevapi 包:
npm install @mysql/xdevapi
以下是示例脚本:
const mysqlx = require('@mysql/xdevapi');
(async () => {
// 使用 MySQL X 协议连接 MySQL
const session = await mysqlx.getSession({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// 如果 schema(数据库)不存在则创建
const schemaExists = await session.getSchema('stackherotest').existsInDatabase();
if (!schemaExists) {
await session.createSchema('stackherotest');
}
// 如果 'users' 表不存在则创建
const tableExists = await session
.getSchema('stackherotest')
.getTable('users')
.existsInDatabase();
if (!tableExists) {
await session
.sql('CREATE TABLE `stackherotest`.`users` '
+ '('
+ '`userId` INT UNSIGNED NOT NULL,'
+ '`name` VARCHAR(128) NOT NULL,'
+ '`address` TEXT NOT NULL,'
+ '`email` VARCHAR(265) NOT NULL'
+ ') '
+ 'ENGINE = InnoDB;')
.execute();
}
// 插入一个示例用户
await session
.getSchema('stackherotest')
.getTable('users')
.insert('userId', 'name', 'address', 'email')
.values(
Math.round(Math.random() * 100000),
'User name',
'User address',
'[email protected]'
)
.execute();
// 统计用户数量
const usersCount = await session
.getSchema('stackherotest')
.getTable('users')
.count();
console.log(`现在 "users" 表中有 ${usersCount} 条记录`);
// 关闭连接
await session.close();
})().catch(error => {
console.error('');
console.error('发生错误!');
console.error(error);
process.exit(1);
});
MySQL 协议(mysql2 包)
如果您更喜欢经典协议,可以使用带有 Promise 支持的 mysql2 包。安装方法如下:
npm install mysql2
使用示例:
const mysql = require('mysql2/promise');
(async () => {
const db = await mysql.createConnection({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// 如有需要,创建数据库
await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');
// 如有需要,创建表
await db.query('CREATE TABLE IF NOT EXISTS `stackherotest`.`users` '
+ '('
+ '`userId` INT UNSIGNED NOT NULL,'
+ '`name` VARCHAR(128) NOT NULL,'
+ '`address` TEXT NOT NULL,'
+ '`email` VARCHAR(265) NOT NULL'
+ ') '
+ 'ENGINE = InnoDB;');
// 插入一个示例用户
await db.query(
'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
[
[
Math.round(Math.random() * 100000),
'User name',
'User address',
'[email protected]'
]
]
);
// 统计用户数量
const [ usersCount ] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
console.log(`现在 "users" 表中有 ${usersCount[0].cpt} 条记录`);
// 关闭连接
await db.end();
})().catch(error => {
console.error('');
console.error('发生错误!');
console.error(error);
process.exit(1);
});
在 Node.js、NestJS 或 TypeORM 中使用 MySQL
如果您使用 Node.js、NestJS 或 TypeORM,可以按如下方式添加 ssl 选项:
TypeOrmModule.forRoot({
type: 'mysql',
host: '<XXXXXX>.stackhero-network.com',
port: <PORT>,
username: 'root',
password: '<ROOT_PASSWORD>',
database: 'root',
entities: [],
synchronize: true,
ssl: {}
});
在 Prisma 中使用 MySQL
如果您使用 Prisma,添加 sslaccept=strict 选项可确保加密连接。配置示例如下:
datasource db {
provider = "mysql"
url = "mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?sslaccept=strict"
}
在 Django 中使用 MySQL
如果尚未安装 mysqlclient 模块,可以通过以下命令安装:
pip install mysqlclient
如果安装时遇到
Exception: Can not find valid pkg-config name错误,可能需要安装libmysqlclient包。 在 Ubuntu/Debian 上可执行:apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev
初次测试时,您可以直接在 settings.py 文件中存储密码。长期来看,建议使用环境变量(见下文)以提升安全性。
请按如下方式编辑您的 settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '<XXXXXX>.stackhero-network.com',
'PORT': '<PORT>',
'OPTIONS': {
'ssl_mode': 'REQUIRED',
},
'NAME': 'root',
'USER': 'root',
'PASSWORD': '<ROOT_PASSWORD>'
}
}
注意:此示例仅用于测试环境,不建议在生产环境中使用!
确认连接无误后,建议使用 django-environ 管理环境变量以提升安全性。
首先安装该包:
pip install django-environ
然后,更新您的 settings.py:
import environ
env = environ.Env()
environ.Env.read_env()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': env('STACKHERO_MYSQL_HOST'),
'PORT': env('STACKHERO_MYSQL_PORT'),
'OPTIONS': {
'ssl_mode': 'REQUIRED',
},
'NAME': 'root',
'USER': 'root',
'PASSWORD': env('STACKHERO_MYSQL_ROOT_PASSWORD')
}
}
在与 settings.py 同一目录下创建或编辑 .env 文件,添加如下内容:
STACKHERO_MYSQL_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MYSQL_PORT=<PORT>
STACKHERO_MYSQL_ROOT_PASSWORD=<ROOT_PASSWORD>
最后,为了保护您的凭据安全,请将 .env 添加到 .gitignore 文件中:
echo ".env" >> .gitignore
在 Java/Spring 中连接 MySQL
要连接 Spring 应用,可以通过设置 SPRING_DATASOURCE_URL 环境变量,并确保以 jdbc: 前缀开头:
SPRING_DATASOURCE_URL=jdbc:mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
在 Groovy/Grails 中连接 MySQL
以下是 Grails 应用连接 MySQL 的配置示例:
dataSource {
pooled = true
driverClassName = "com.mysql.cj.jdbc.Driver"
dialect = org.hibernate.dialect.MySQL8Dialect
// SSL 相关属性
properties {
useSSL = true
requireSSL = true
verifyServerCertificate = true
sslMode = "REQUIRED"
}
}
environments {
production {
dataSource {
dbCreate = "none"
url = "jdbc:mysql://" + System.env.STACKHERO_MYSQL_HOST + ":" + System.env.STACKHERO_MYSQL_PORT + "/root?useSSL=true&requireSSL=true&verifyServerCertificate=true&sslMode=required" // 您可以将 "/root" 替换为所需数据库名。
username = "root" // 建议为您的应用创建专用用户。
password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD
properties {
maxActive = 50
minEvictableIdleTimeMillis = 1800000
timeBetweenEvictionRunsMillis = 1800000
numTestsPerEvictionRun = 3
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "SELECT 1"
}
}
}
}
通过 phpMyAdmin 创建 MySQL 用户
为提升安全性,建议为您的应用创建专用用户,而不是直接使用 "root" 用户。您可以通过 phpMyAdmin 轻松完成:
-
在 phpMyAdmin 顶部菜单中选择
User accounts。
-
点击
Add user account。
-
填写用户创建表单:
- 输入账户名(通常为您的应用名称)
- 点击
Generate password生成安全密码并复制 - 选择
Create database with same name and grant all privileges
提交表单后,您将拥有一个新用户和一个与用户名同名的专用数据库。