将 SQL 表导出为 CSV 是报告、迁移、备份和数据分析中的常见任务,但最佳导出方法取决于您的数据库平台和数据集大小。

本指南展示如何在 SQL Server、MySQL、PostgreSQL 和 Oracle 中使用内置工具、命令行实用程序和 Python 将 SQL 表导出为 CSV,同时避免缺失表头和编码错误等常见问题。

导出之前:需要决定的 3 件事

在将 SQL 表导出为 CSV 之前,请检查几个可能影响输出结果的设置。提前做出这些决定有助于防止格式问题、提高导出性能,并确保生成的 CSV 文件可供直接使用。

  • 整张表还是筛选结果: 导出整张表适用于小型数据集,但大表可能消耗大量内存和带宽。如果可能,请通过查询中的筛选条件仅导出所需行。
  • 是否包含表头: 如果您需要将 SQL 表导出为带表头的 CSV,请检查您的工具默认是否包含列名。表头行使导出的文件更易于阅读,并简化将其导入电子表格或其他数据库的过程。
  • 数据格式和编码: 包含逗号、引号或换行符的字段应正确转义以保持 CSV 结构。对于多语言数据或 CJK 字符,UTF-8 编码通常是防止文字乱码的最安全选择。

将 SQL Server 表导出为 CSV

SQL Server 提供了多种将表数据导出为 CSV 文件的方式,无论您偏好图形工具还是命令行脚本。数据库管理员和分析师都能找到适合其特定任务的原生方法。

使用 SSMS 将 SQL Server 表导出为 CSV

SQL Server Management Studio (SSMS) 提供了两种主要的可视化选项。结果网格适用于快速的一次性导出,而导入和导出向导则适用于更大、可重复的作业。如果您还需要将数据导出为电子表格格式,将 SQL 表数据导出到 Excel 的过程遵循类似的基于向导的方法。

通过结果网格导出:

步骤 1. 打开 SSMS 并在编辑器中运行您的查询。
步骤 2. 在 结果网格 内右键单击,选择 Save Results As
步骤 3. 选择目标文件夹,命名文件,并将其保存为 CSV。

通过 ssms 中的结果网格导出

通过 SQL Server 导入和导出向导导出:

步骤 1. 在 对象资源管理器 中右键单击您的数据库,悬停在 Tasks 上,选择 Export Data
步骤 2. 选择您的数据源提供程序,然后单击 Next
步骤 3. 将目标设置为 Flat File Destination,输入目标文件路径,并确认格式设置为 Delimited
步骤 4. 选择 Copy data from one or more tables or views,或改为编写查询。
步骤 5. 勾选 Column names in the first data row 框,以便导出的 CSV 包含表头,然后完成向导。

通过 ssms 中的 sql server 导入和导出向导导出

使用 PowerShell(Invoke-Sqlcmd + Export-Csv)

对于自动化数据库任务的系统管理员来说,PowerShell 是一个实用的选择。您可以直接从 shell 运行查询,并将结果通过管道传输到格式化 cmdlet 中。

要从命令行运行导出,请在单个管道中组合使用 Invoke-SqlcmdExport-Csv

code
Invoke-Sqlcmd -ServerInstance "MyServerInstance" -Database "MyDatabase" -Query "SELECT * FROM MyTable" | Export-Csv -Path "C:\Exports\data.csv" -NoTypeInformation

Export-Csv 将对象流转换为结构化文本,并默认包含列表头,因此输出可立即使用。

使用 BCP / SQLCMD(适用于大表)

由于内存限制,图形工具在处理大表时可能会滞后或崩溃。在这种情况下,专用的命令行实用程序提供了更快、更稳定的 SQL 表数据导出方式。

批量复制程序(bcp)是一个为移动大型数据集而构建的命令行工具。基本语法如下:

code
bcp "MyDatabase.dbo.MyTable" out "C:\Exports\large_data.csv" -c -t "," -T -S "MyServerInstance"

-c 标志以字符模式运行导出,-t "," 将逗号设置为字段分隔符,-T 使用受信任的 Windows 身份验证进行连接。

注意:bcp 默认不将列表头写入输出文件。如果需要表头,您可以使用格式文件,或编写将列名与数据合并的查询。

sqlcmd 提供了另一种运行导出 SQL 表到 CSV 命令行过程的方式:

code
sqlcmd -S MyServerInstance -d MyDatabase -E -Q "SELECT * FROM MyTable" -s "," -W -o "C:\Exports\data_sqlcmd.csv"

其中,-E 建立受信任连接,-s "," 设置逗号分隔符,-W 去除尾随空格以减小文件大小。

将 MySQL 表导出为 CSV

MySQL 支持服务端和客户端两种导出数据集的方式,具体取决于您的用户权限和对主机的网络访问权限。您可以使用直接的 SQL 语句、命令行实用程序或可视化管理控制台。

使用 SELECT … INTO OUTFILE

对于快速的服务器端提取,您可以直接在 SQL 编辑器中运行 SELECT ... INTO OUTFILE 语句。这会将文件直接写入主机。

sql
SELECT * FROM my_table
INTO OUTFILE '/var/lib/mysql-files/export.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

这种方法效率很高,因为它无需将原始数据通过网络传输到本地工作站。也就是说,您的数据库用户账户需要 FILE 权限才能运行此语句。MySQL 服务器通常还通过 secure-file-priv 变量进行锁定,该变量将文件写入限制在服务器文件系统上的特定目录中。

使用 mysqldump(–tab 方法)

备份实用程序 mysqldump 提供了另一种通过命令行将表导出为 CSV 的方式。--tab 选项告诉该工具将表结构和原始数据输出为两个单独的文件。要更全面地了解此实用程序在单表导出之外的功能,请参阅这份 使用 mysqldump 导出 MySQL 数据库 的指南。

从终端运行命令:

command
mysqldump -u root -p --tab=/var/lib/mysql-files my_database my_table

这会生成一个包含表定义的 my_table.sql 文件和一个包含制表符分隔数据的 my_table.txt 文件。在底层,--tab 方法依赖于相同的服务端 INTO OUTFILE 机制,因此您的账户仍然需要 FILE 权限,并且您需要对服务器上的目标文件夹具有写入权限。

使用 MySQL Workbench(GUI)

如果您没有 shell 访问权限或 MySQL 服务器上的写入权限,MySQL Workbench 允许您在不满足这些要求的情况下将表数据导出为 CSV 格式。

这种客户端方法完全绕过了服务器目录限制。如果您已经在探索 Workbench 的导出功能,值得了解的是该工具还处理完整的 MySQL Workbench 备份数据库 任务,而不仅仅是单表导出。

步骤 1. 在工作区中运行 SELECT 查询。
步骤 2. 在查询结果面板中,单击结果网格工具栏上的 Export 按钮。
步骤 3. 从格式下拉菜单中选择 CSV,选择本地计算机上的目标位置,然后单击 Save

mysql workbench

此方法在您的本地机器上处理所有数据处理。它使用简单,但通过网络拉取大型数据集可能会消耗大量本地内存和带宽。

将 PostgreSQL 表导出为 CSV

PostgreSQL 提供了两个不同的命令来将表数据写入 CSV 文件,具体取决于您需要服务端速度还是客户端可访问性。当您在权衡权限级别和部署架构时,这种区别就很重要。

使用 COPY(服务端)

SQL COPY 命令在数据库服务器本身上运行。这提供了快速的数据传输,因为记录永远不会通过网络流式传输到客户端应用程序。

您可以在查询编辑器中按以下语法运行该命令:

sql
COPY my_table TO '/var/lib/postgresql/data/export.csv' WITH (FORMAT CSV, HEADER);

HEADER 选项是将表导出为带表头的 CSV 的关键。由于查询直接将文件写入数据库主机上的本地存储,运行它需要超级用户权限或 pg_write_server_files 角色的成员资格。

使用 \copy(客户端,适用于托管/云 Postgres)

对于超级用户文件系统访问受限的托管云数据库实例,您可以使用 psql 交互式终端的客户端元命令 \copy

psql 命令行实用程序内部直接运行此元命令:

command
\copy my_table TO '~/local_exports/data.csv' WITH (FORMAT CSV, HEADER)

与服务端命令不同,\copy 通过您的网络连接流式传输数据库记录,并将文件写入您的本地机器。这绕过了服务器管理员权限的需求,这就是为什么它是从 AWS RDS 或 GCP Cloud SQL 等托管环境中拉取数据的团队的标准选择。

将 Oracle 表导出为 CSV

Oracle Database 环境提供了图形化和命令行两种选项,用于将大型关系表转换为格式化的文本文件。您可以使用可视化数据库客户端或脚本 shell 来运行提取,具体取决于您的工作流。

如果您不确定哪个表包含所需数据,这份 如何列出 Oracle Database 中的表 的指南是一个有用的起点。

使用 SQL Developer 的导出向导

如果您偏好图形界面,SQL Developer 内置的导出向导让您只需点击几下即可运行 Oracle SQL Developer 导出表到 CSV 的操作。此工具适合希望快速可视化设置的开发人员和分析师。

步骤 1. 打开 SQL Developer,在 Connections 导航树中找到目标表,右键单击表名,然后选择 Export
步骤 2. 在导出向导窗口中,取消勾选 Export DDL 选项以跳过生成表结构创建脚本。
步骤 3.Format 下拉菜单更改为 csv,选择目标文件夹路径,然后单击 Next
步骤 4. 在审核屏幕上确认列选择,然后单击 Finish 输出文件。

oracle sql developer 导出向导

使用 SQLcl / SPOOL 配合 SET SQLFORMAT CSV

对于大型数据集或脚本自动化,Oracle 的现代命令行界面 SQLcl 支持直接的文本格式化命令。您可以将此格式化设置与传统的 SPOOL 实用程序配对使用,将记录直接流式传输到文件中。

在 SQLcl 中运行以下命令:

sql
SET SQLFORMAT CSV
SET FEEDBACK OFF
SPOOL "/u01/app/oracle/exports/data.csv"
SELECT * FROM my_table;
SPOOL OFF

SET SQLFORMAT CSV 命令告诉终端自动使用逗号分隔和列表头格式化所有输出。SET FEEDBACK OFF 也值得包含,因为没有它,SQLcl 会在文件末尾附加一行”rows selected”摘要行,这会破坏 CSV 结构。

将这些设置与 SPOOL 结合使用,可以将查询结果直接写入您的文件系统,保持低内存使用率,并防止在处理大表时控制台冻结。

适用于所有数据库的单一脚本:使用 Python 导出为 CSV

当您管理混合环境时,为每个数据库引擎学习不同的命令行语法可能会拖慢您的速度。一个适用于所有主要数据库系统的单一编程解决方案可以大大简化这一过程。

基本脚本结构

导出 SQL 表到 CSV 的 Python 操作遵循三个步骤:建立连接引擎、拉取目标记录,并将数据集写入磁盘。pandas 库管理数据流,使导出带表头的 SQL 表到 CSV 变得简单。

您可以使用以下标准 Python 模板进行连接和导出:

python
import pandas as pd
from sqlalchemy import create_engine

# 步骤 1. 定义连接字符串(以 PostgreSQL 为例)
conn_string = "postgresql+psycopg2://user:password@host:5432/database"
engine = create_engine(conn_string)

# 步骤 2. 执行查询并将数据读入 DataFrame
query = "SELECT * FROM my_table"
df = pd.read_sql_query(query, con=engine)

# 步骤 3. 将 DataFrame 输出为 CSV 文件
df.to_csv("local_export.csv", index=False, encoding="utf-8")

您可以通过更改连接字符串并安装匹配的数据库驱动(如 pyodbccx_Oraclepymysql)将同一模板适配到 SQL Server、Oracle 或 MySQL。设置 index=False 可防止 pandas 在输出文件中添加额外的行号列。

何时使用 Python 而非原生数据库工具

bcp\copy 这样的原生工具在原始数据传输方面更快,但 Python 更适合计划自动化 and 数据预处理。您可以使用 cron 或 Windows Task Scheduler 运行 Python 脚本,以设定间隔将表数据拉取为 CSV 文件。

当您的团队需要在将最终 CSV 写入共享网络目录之前清理数据、替换空值或屏蔽敏感列时,它也很适用。

修复最常见的 CSV 导出问题

CSV 导出可能会遇到结构性布局错误或字符编码问题。修复这些问题通常归结为调整工具设置或优化查询语法。

缺少或错误的列表头

许多命令行实用程序默认会去除列表头。例如,SQL Server 的 bcp 实用程序除非添加额外步骤,否则不输出表头。

要解决此问题,您可以编写一个 UNION ALL 查询,将列名字面值作为第一行选择,或者切换到默认包含表头的 sqlcmd。如果您使用 SSMS,请检查 Tools > Options > Query Results 下的设置,确认保存选项包含表头元数据。

编码损坏 / 特殊字符乱码(UTF-8 vs Unicode)

带重音符号的字符、变音符号和 CJK 文本在导出后经常变成随机符号或问号。当导出时使用的编码与查看应用程序期望的编码不匹配时,就会发生这种情况。

UTF-8 通常是保持文本完整性的最安全选择。

如果您的团队主要在 Microsoft Excel 中打开 CSV 文件,使用带字节顺序标记(BOM)的 UTF-8 导出,或使用 UTF-16,会给 Excel 更清晰的信号来正确渲染 Unicode 字符。

字段值中的逗号或引号破坏 CSV 结构

如果您的数据库列包含带有逗号、换行符或引号的原始文本,导出的文件可能会最终错位。一个未转义的逗号会将其后面的每个字段向右推一列,从而破坏您的表结构。

大多数现代导出向导通过将字符串字段括在双引号中来自动处理此问题。如果您正在编写连接值的自定义查询,可以在输出写入之前使用字符串替换函数通过加倍来转义双引号。

大表导出超时或崩溃

通过图形界面导出数百万行通常会耗尽客户端内存并冻结您的工作站。对于海量数据集,像 PostgreSQL 的 \copy 或 SQL Server 的 bcp 这样的命令行工具更合适,因为它们直接将数据流式传输到磁盘并保持低内存使用。

如果您的系统强制执行严格的查询超时限制,您还可以使用 LIMITOFFSET 来分页导出数据。

一次性导出还不够:使用 i2Backup 实现自动化备份

CSV 导出只是一个快照。它捕获了某一时刻的表数据,一旦生产数据再次变更,该文件就过时了。如果您将导出 CSV 作为报告周期、迁移或灾难恢复计划的一部分,您需要一些在导出完成后仍能持续工作的方案。

这就是专用备份解决方案发挥作用的地方。i2Backup 保护您在本指南中查询过的数据库——无论是 SQL Server、MySQL、PostgreSQL 还是 Oracle——并使其始终可恢复,而无需每次都手动导出。

i2Backup 提供了与此类数据库保护相关的多项功能:

  • 实时和计划数据库备份:持续捕获重做日志和归档日志数据,支持接近零的 RPO 和时间点恢复。它保护单数据库实例和集群环境(HA、ADG、RAC),并支持 Oracle、MS SQL、IBM DB2 和 MongoDB。
  • 表级备份和恢复:如果您只需要导出或恢复特定表而非整个数据库,i2Backup 支持表级备份和恢复,这正如同本文涵盖的针对性提取操作,只不过它提供的是持续保护而非一次性文件。
  • 灵活的调度:您可以配置备份任务按小时、每天、每周、每月或每年运行,因此恢复点始终保持最新,无需任何人手动触发导出。
  • 全面的监控和报告:实时监控界面跟踪备份活动,电子邮件和短信告警自动标记任务状态,这对于管理计划 Python 脚本或 Cron 作业来拉取 CSV 的同一团队非常有用。

如果您的数据库是更大灾难恢复策略的一部分而不仅仅是单个备份目标,i2CDP 通过字节级持续数据保护进一步扩展了这一能力,实时复制变更,将 RPO 降至秒级或实现零数据丢失。

将表导出为 CSV 解决的是某个时刻的需求。备份其背后的数据库解决的则是持续的需求。如果您的团队尚未为本指南中涉及的数据库设置自动化保护,那么在下一次导出请求变成恢复紧急事件之前,值得进行评估。

结论

将 SQL 表导出为 CSV 在纸面上看起来很简单,但正确的方法取决于您的数据库、表大小以及下游数据的使用方式。SSMS 和 MySQL Workbench 适用于快速的一次性导出。像 bcpsqlcmdmysqldump\copy 这样的命令行工具对于大表和自动化更具可扩展性。当您跨多个数据库引擎工作时,Python 提供了一个单一的、可重复使用的脚本。

无论您选择哪种方法,请注意本文中提到的常见陷阱:缺少表头、编码不匹配、字段值中未转义的逗号以及大表导出超时。及早发现这些问题可以避免您重新运行作业或交付损坏的文件。

如果您的团队定期导出数据用于报告、迁移或恢复,那么将此工作流与自动化数据库备份相结合是值得的,这样一次性的 CSV 导出就不会成为您的唯一安全网。

博客分类底部

准备好构建企业数据韧性了吗?

立即开启 60 天免费试用,或预约产品演示,了解英方软件如何为您的核心业务提供「零中断、零丢失」的数据保护。

请先完成图形验证

验  证  码:

英方官网验证码
第三方二维码 第三方二维码
英方公告铃铛图标
英方公告铃铛图标

公告

英方侧边栏向右箭头
英方高亮提示圆点
英方软件公告
各位求职者、合作伙伴:
近期有第三方冒用英方名义发布虚假招聘、不实业务信息。我司正规招聘全程零收费,非官网渠道信息均不作数。
信息核验热线:400-0078-655
遇诈骗请保留证据,及时联系我们并报警
英方软件
2026 年 6 月 23 日
英方邮件咨询图标
英方邮件咨询图标

邮件

英方销售支持图标
英方销售支持图标

销售

英方侧边栏向右箭头
联系销售:400-0078-655 转 1