第 08 章导入与导出

导出支持 CSV / JSON / SQL INSERT 三种格式;导入只支持 CSV。 两个操作都在后台做,大表也不会把界面卡住。

导出

四个入口

入口导出的内容
对象树右键表 → 导出…整张表,没有过滤条件
数据视图状态栏 导出…当前过滤条件下的全部数据(不是只导当前页)
查询结果标签右键 → 导出结果…该结果集的全部行
右键选中行 → 导出选中行…仅选中的那些行
注意导的是「全部」不是「当前页」

在数据视图里点导出,导出的是满足当前过滤条件的全部行, 而不是你眼前这一页的 300 行。导出面板的顶部会明确写出这一点,例如 (应用了过滤条件:status = 'published',共约 12,480 行)

导出面板

导出面板 导出 源: app_dev.articles 应用了过滤条件:status = 'published',共约 12,480 行 格式 CSV JSON SQL INSERT CSV 选项 分隔符 , 逗号 / 制表符 / 分号 换行符 \n LF / CRLF 包含表头 文本编码 UTF-8 UTF-8 / UTF-8 BOM NULL 表示 空字符串 空字符串 / NULL 字面量 日期格式 原样输出 换一种格式时,这一整块选项会换成对应的选项。 选 JSON 时出现「扁平 / 嵌套」「美化」; 选 SQL 时出现「每条插入行数」「包含 CREATE TABLE」。 后台导出,完成后通知我 打开后可以切到别的标签继续干活 保存到 ~/Downloads/articles.csv 选择… 取消 导出 1 2 3 4 5 6 7
图 8-1 导出面板。选项区会随格式切换。
#区域说明
1源信息 明确写出导的是哪张表、有没有过滤条件、大约多少行。这里的信息是防止「以为导了全表结果只导了一部分」的关键。
2格式 三选一:CSV / JSON / SQL INSERT。切换会换掉下面的选项区。
3格式选项 见下方「三种格式各自的选项」。
4选项说明 灰色小字解释每个选项,不用去查文档。
5后台导出 勾上后导出在后台跑,状态栏显示进度,你可以切到别的标签继续工作;完成后给一个轻提示,附「在 Finder 中显示」按钮。
6保存路径 默认落在 ~/Downloads,文件名按表名自动取。点「选择…」改路径。
7导出按钮 开始导出。导出过程中按钮变成「取消」,随时可以停。

三种格式各自的选项

三种导出格式 CSV 分隔符  , / ⇥ / ; 换行符  LF / CRLF 包含表头 是 / 否 文本编码 UTF-8 / UTF-8 BOM NULL 表示 空字符串 / NULL 日期格式 原样 / 自定义 含特殊字符(分隔符、引号、换行)的 字段用双引号包起来,内部的双引号 转义成两个双引号。 NULL 与空字符串默认能区分开。 JSON 结构   扁平 / 嵌套 美化   是 / 否 缩进   2 空格 输出一个对象数组。数字列输出为数字, 其余为字符串,NULL 为 null。 默认扁平、默认美化。 [  { "id": 1, "name": "张三" },  { "id": 2, "name": null } ] SQL INSERT 每条插入行数 1 / 100 / 500… 包含 CREATE TABLE 是 / 否 语句一律带上目标表名;值用安全的 字面量形式,二进制输出成十六进制。 INSERT INTO `app_dev`.`users`  (`id`,`name`,`email`) VALUES  (1,'张三','zs@example.com'),  (2,'李四','ls@example.com'); 三种格式都可以随时取消。取消后已经写入的部分会保留,并明确告诉你这是一个不完整的文件。 大表导出不会一次性把所有数据读进内存,是一边从服务器读一边写文件。
图 8-2 三种格式的选项与输出样子。

导出过程中

导出出错时

情况提示
导出途中连接断开「导出中断,文件不完整」,保留已写内容
目标文件不可写提示具体原因(权限、磁盘空间、路径不存在)
目标文件已存在询问是否覆盖

CSV 导入

入口有两个:菜单「文件 → 导入 CSV…」(⇧⌘I),或者对象树右键表 → 导入 CSV…。整个流程分三步。

第一步:选文件与解析选项

导入 CSV(1/3) 导入 CSV(1/3) 文件 ~/Downloads/users.csv 选择… 预览(前 20 行) id name email created_at 1张三 zs@example.com 2025-01-01 10:00:00 2李四 ls@example.com 2025-01-02 11:00:00 3王五 ww@example.com 2025-01-03 09:30:00 自动识别到分隔符:逗号(,)· 编码:UTF-8 分隔符 , 首行是表头 文本编码 自动检测 换行符 自动检测 下一步
图 8-3 导入向导第一步。预览表能让你一眼确认解析对不对。

第二步:列映射

导入 CSV(2/3) 导入 CSV(2/3) 目标表 app_dev.users CSV 列 目标列 类型 说明 id id int unsigned 主键 · 自增 name name varchar(50) 非空 email email varchar(100) created_at (跳过) 不参与插入 phone (跳过) 未匹配到 CSV 列名在表里没有 遇到错误时继续导入其余行 导入前先清空目标表(TRUNCATE) 危险:会删掉表里已有的全部数据 在事务中导入 要么全部成功,要么全部回滚 预计导入: 12,480 行 上一步 下一步
图 8-4 导入向导第二步:列映射。

第三步:执行

导入 CSV(3/3) 导入 CSV(3/3) 正在导入… 约 60% 已写入 7,420 行 / 12,480 成功 7,420 · 失败 0 取消 完成 如果有失败行 导入结束:成功 12,472 行,失败 8 行 失败原因(前 100 条): 第 1,204 行 → [错误 1406] Data too long for column 'name' 第 5,617 行 → [错误 1048] Column 'email' cannot be null 导出失败行 CSV
图 8-5 导入进度与失败行列表。失败行可以导出成 CSV,修正后重试。

导入的行为规则

行为
进度实时显示已写入行数,可以取消
勾选「在事务中导入」要么全部成功,要么全部回滚
不勾选逐行提交,中间失败时前面导入的行会留下来(部分成功)
取消导入事务模式:回滚;非事务模式:保留已导入的行并明确提示
有失败行导入结束后列出前 100 条失败原因,可导出为 CSV 以便修正后重试
导入完成自动刷新对应表的标签

从 CSV 新建表

如果目标表还不存在,可以在入口处选「导入到新表」。这时第二步会变成推断列类型的界面。

从 CSV 新建表 导入到新表 新表名 users_imported 全部按文本类型创建 列类型按前 N 行的内容推断,下面每一列都可以手动改。 CSV 列 推断类型 推断依据 id INT 全是整数 name VARCHAR(255) 文本 created_at DATETIME 形如日期时间 amount DECIMAL(10,2) 带小数点的数字 推断不准就在这里改
图 8-6 从 CSV 新建表。推断结果都可以改,实在不行就「全部按文本类型创建」。

明确不做

导入导出的边界
  • Excel(.xlsx)导入导出
  • JSON 文件导入(只导出)
  • SQL dump 文件导入——用 mysqldump / mysql 命令行更合适
  • 数据库备份 / 恢复
  • 导入时的数据转换规则(大小写转换、截断长度、正则替换之类)

需要清洗数据的话,导成 CSV 用脚本处理完再导回来。