mysql -e 创建数据库报“Access denied”主因是未显式传入用户密码;应使用 mysql -u root -p'pwd' -e "CREATE DATABASE...",密码含特殊字符需单引号包裹;避免权限问题需确保账户有 CREATE 权限;建库应优先用 IF NOT EXISTS 防重名错误。

mysql -e 创建数据库时为什么报错“Access denied”
直接执行 mysql -e "CREATE DATABASE db_name" 失败,大概率是没传认证信息。MySQL 8.0+ 默认拒绝空用户、空密码连接,且 mysql 客户端不会自动读取 ~/.my.cnf 里的配置(除非显式加 --defaults-file 或 --defaults-extra-file)。
实操建议:
- 必须显式指定用户和密码:
mysql -u root -p'your_password' -e "CREATE DATABASE myapp_dev"(注意-p和密码之间**不能有空格**,否则密码会被当成新命令参数) - 密码含特殊字符(如
$、!)时,整个-p'xxx'必须用单引号包裹,避免 shell 提前解析 - 若用 root 但提示权限不足,检查是否启用了
skip-grant-tables或账户被限制了CREATE权限
如何让 mysql -e 脚本跳过已存在数据库的报错
CREATE DATABASE 遇到同名库会报错 ERROR 1007 (HY000): Can't create database 'xxx'; database exists,导致脚本中断。这不是语法错误,而是预期行为。
解决方法只有两个可靠路径:
- 改用
CREATE DATABASE IF NOT EXISTS db_name—— 最简洁,无需额外判断,MySQL 原生支持 - 先查再建(不推荐):
mysql -u u -p'p' -Nse "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='mydb'" | grep -q mydb || mysql -u u -p'p' -e "CREATE DATABASE mydb",但多一次网络往返,且-Nse输出易受字符集/空格干扰
别信网上“加 2>/dev/null 就能静默”的说法——错误仍会退出非零状态,后续命令照样不执行。
在 Shell 脚本里安全拼接数据库名和字符集
数据库名不能含空格、点号、连字符,字符集和排序规则需与 MySQL 实例默认值对齐,否则后续导入数据可能乱码或建表失败。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
实操要点:
- 数据库名建议只用小写字母+下划线:
db_name=$(echo "$INPUT" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9_]/_/g') - 显式指定字符集比依赖默认更可控:
mysql -u u -p'p' -e "CREATE DATABASE IF NOT EXISTS $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" - utf8mb4 是 MySQL 5.5.3+ 推荐值,别用已废弃的
utf8(实际是 utf8mb3) - 如果脚本要支持变量传入,务必对
$db_name做白名单校验,防止 SQL 注入(哪怕只是库名,恶意输入如test; DROP DATABASE mysql;在双引号内也会被 shell 执行)
mysql -e 和 mysql
mysql -e 适合单条、简单、参数化的操作;一旦逻辑变复杂(比如建库 + 建用户 + 授权 + 导入初始化数据),立刻变得难维护、难调试。
真实项目中的取舍:
- CI/CD 流水线里创建测试库:用
mysql -e,快、轻量、一行搞定 - 部署脚本中初始化生产环境:写成
.sql文件,用mysql -u u -p'p' db_name ,方便 review、diff、复用已有 SQL 模板 - 混合场景(如动态库名 + 固定建表语句):用 heredoc:
mysql -u u -p'p'
容易被忽略的是连接超时——长 SQL 文件执行时,mysql -e 不带 --connect-timeout 或 --max-allowed-packet 参数,遇到大库或慢网可能直接断连,而 mysql 更稳定。










