根本原因是mysql客户端无默认数据库上下文;即使sql文件含use语句,若被注释或未写,或使用mysql -e非交互方式,其可能不生效;应显式指定库名:mysql -u root -p my_database_name。
mysql 导入 sql 文件报 no database selected
根本原因不是文件本身有问题,而是执行导入时 mysql 客户端没默认数据库上下文。即使 sql 文件里有 use mydb;,如果它出现在文件开头之前(比如被注释掉、或压根没写),或者你用的是 mysql -e "source xxx.sql" 这类非交互式方式,use 语句可能不会生效。
导入前必须显式指定数据库名(两种可靠方式)
别依赖 SQL 文件里的 USE,直接在命令行或连接参数里钉死库名:
mysql -u root -p my_database_name —— 这是最稳的,库名作为最后一个参数传入,所有语句都在该库上下文中执行-
mysql -u root -p -D my_database_name -e "source /path/to/dump.sql;"——-D参数等价于--database,效果同上
注意:mysql -u root -p (不带库名)一定会触发 <code>No database selected,哪怕 dump.sql 开头有 USE 也不行——因为重定向输入时,USE 是作为普通语句执行的,而 source 命令本身不支持在非交互模式下切换库上下文。
SQL 文件头加 USE 有用,但有前提条件
只有在交互式客户端中执行 source 才会真正生效。如果你坚持用 source,必须满足两个条件:
- 文件第一行不能是注释、空行或
SET等干扰语句,USE必须是可执行的第一条语句 - 必须进入 MySQL 交互终端后手动执行:
mysql -u root -p→ 输入密码 →USE mydb;→source /path/to/dump.sql;
常见坑:mysqldump 默认导出的文件通常带 CREATE DATABASE 和 USE,但如果你用 --no-create-db 或手动删过,就只剩表结构了,这时光靠文件头加 USE 没用。
检查 SQL 文件是否真含有效 USE 语句
别假设“我加过了”,打开文件确认:
head -n 5 dump.sql
看输出里是否有类似这样的行:
USE `myapp_prod`;
注意点:
- 不能是注释掉的:
-- USE mydb;或/* USE mydb; */都无效 - 库名要带反引号(尤其含短横线或关键字时),否则可能语法错误
- 如果文件里有多个
USE,只认第一个;后续的会被忽略或报错
最省事的做法:删掉文件里所有 USE,改用命令行指定库名。文件越干净,越不容易被不同 MySQL 版本或客户端行为搞崩。











