R / Richie全部文章 ↑

Python · 2 分钟阅读

MySQL 安装与配置

2026 年推荐:MySQL 8.0 LTS(生产环境),MariaDB 11.x(开源替代)。

版本选择

数据库 状态 说明
MySQL 5.7 已停止 不推荐
MySQL 8.0 长期支持 生产首选
MySQL 8.4 当前创新版 新功能优先
MariaDB 11.x 长期支持 兼容 MySQL,性能更优

安装

macOS

brew install mysql@8.0
brew services start mysql@8.0

Ubuntu / Debian

sudo apt update
sudo apt install -y mysql-server-8.0
sudo systemctl start mysql

Docker(最推荐)

docker run --name mysql8 -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -e MYSQL_DATABASE=django_bbs \
  -e MYSQL_USER=django \
  -e MYSQL_PASSWORD=django_pwd \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci

字符集配置

确保数据库与表使用 utf8mb4:

CREATE DATABASE django_bbs
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_0900_ai_ci;

用户与权限

-- 创建专用账号(避免用 root)
CREATE USER 'django'@'%' IDENTIFIED BY 'strong_password';

-- 最小权限原则
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER,
      REFERENCES ON django_bbs.* TO 'django'@'%';

FLUSH PRIVILEGES;

Django 端配置

# settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "django_bbs",
        "USER": "django",
        "PASSWORD": os.getenv("DB_PASSWORD"),
        "HOST": "127.0.0.1",
        "PORT": "3306",
        "OPTIONS": {
            "charset": "utf8mb4",
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
        },
        "CONN_MAX_AGE": 60,
    }
}

驱动选择

驱动 类型 维护方
mysqlclient C 扩展,性能最佳 Django 官方推荐
PyMySQL 纯 Python,部署简单 社区
mysql-connector-python 官方 Oracle

安装:

uv pip install mysqlclient

最佳实践

  • ✅ 用专用账号 + 最小权限
  • ✅ 启用 STRICT_TRANS_TABLES SQL 模式
  • ✅ 使用连接池(CONN_MAX_AGE 或外部 Proxy)
  • ✅ 密码通过环境变量注入
  • ❌ 不要让 root 远程可登录