把查询结果写进文件
MySQL 用 SELECT ... INTO OUTFILE 把结果写到服务器文件,路径受 secure_file_priv 限制;PostgreSQL 用 COPY 走服务端(需要相应角色权限),或用 psql 的 \copy 元命令走客户端权限。导出大批数据时,这两种方式都绕开了应用层的网络往返。
基本信息
| MySQL 语法 | SELECT … INTO OUTFILE '路径',配 FIELDS/LINES 子句定格式 |
|---|---|
| MySQL 权限 | 需要 FILE 权限;路径须在 secure_file_priv 允许目录内 |
| 目标已存在 | MySQL 会直接报错 |
| PostgreSQL | COPY TO 服务端执行,需高权限角色 |
| psql 元命令 | \copy 走客户端文件系统与客户端权限 |
典型使用场景
- 把报表结果导出成 CSV 交给业务方
- 跨库迁移时先导出成文件再导入
- 单表数据的快速批量备份
- 让大查询结果直接落盘,不经过应用层
- 跨环境比对数据差异
MySQL 写法
MySQL 写法
SELECT id, name FROM users
INTO OUTFILE '/var/lib/mysql-files/users.csv'
FIELDS TERMINATED BY ',' -- 字段分隔符
OPTIONALLY ENCLOSED BY '"' -- 字符串加引号
LINES TERMINATED BY '\n'; -- 行分隔符
-- 目标文件不能已存在;路径必须落在 secure_file_priv 允许的目录内PostgreSQL 写法
PostgreSQL 写法
-- 服务端 COPY:文件写在数据库服务器上
COPY (SELECT id, name FROM users)
TO '/tmp/users.csv'
WITH (FORMAT csv, HEADER);
-- 客户端 \copy:文件写在 psql 所在的机器上
\copy (SELECT id, name FROM users) TO 'users.csv' CSV HEADER两库对照
| 维度 | MySQL INTO OUTFILE | PostgreSQL COPY |
|---|---|---|
| 文件位置 | 数据库服务器上 | COPY 在服务器,\copy 在客户端 |
| 所需权限 | FILE 权限加路径白名单 | 服务端需超级用户或对应角色 |
| 目标已存在 | 直接报错 | 需显式指定覆盖行为 |
| 格式控制 | FIELDS/LINES 子句 | WITH (FORMAT csv, HEADER) 等选项 |
| 客户端导出 | 无等价语法 | psql 的 \copy |
OUTFILE 会把文件写在数据库服务器上:导出目录同主机的其他进程可能读到,敏感数据导出后要尽快转移并清理,不要长期留在服务器上。
MySQL 报 secure_file_priv 相关错误时,先执行 SHOW VARIABLES LIKE 'secure_file_priv' 看允许目录,不要随手改服务器参数。
导出文件里的 NULL 表示方式因库而异:MySQL 使用反斜杠转义写法,导入到别的库时若格式不同,需要显式指定 NULL 字符串再导。
导出的编码与换行符也要对齐:中文数据按 UTF-8 打开,跨平台时换行与前导空白可能影响解析,脚本里显式指定格式更稳。