第 03 章浏览表数据
从对象树点一张表,就打开了它的数据视图。这一章讲表格长什么样、
右边那条「字段栏」怎么用、怎么翻页、怎么排序,各种奇怪的内容
(NULL、BLOB、超长文本、图片)分别怎么显示。
数据网格
图 3-1 数据网格。鼠标悬停在超长内容的单元格上,会弹出它到底有多大。
| # | 元素 | 含义 |
| 1 | 行号列 |
最左边一列序号。点它可以选中整行;⌘ + 点击可以多选不连续的行。有已修改的行,行号上会带标记。 |
| 2 | 主键列 |
表头带钥匙图标、列名加粗。有主键的表才可以编辑(见第 4 章)。 |
| 3 | 外键跳转 ↗ |
外键列的单元格后面带这个箭头。点一下会在新标签打开被引用的那张表,并自动只显示对应的那一行。 |
| 4 | NULL |
灰色的斜体 NULL。注意它和空字符串不一样:空字符串显示为一格空白。 |
| 5 | 二进制 |
长二进制显示成 «BLOB 12.3 KB»;很短的直接显示十六进制 0xDEADBEEF,省得还要点开看。 |
| 6 | 超长文本 |
末尾带 … 表示被截断了。悬停会告诉你原始大小,点开或双击才去服务器取完整值。 |
| 7 | 已修改的单元格 |
橙色底色 + 左上角小三角 = 有未提交的修改。行号列也会出现同样的标记。 |
| 8 | 排序箭头 |
点列头排序:第一次 ▲ 升序,第二次 ▼ 降序,第三次取消。 |
| 9 | 滚动条 |
按偏好可以自动隐藏。滚到表格底部就是当前页的最后一行,不是整张表的最后一行。 |
网格只读
数据网格本身只读,不能在格子里直接改值。双击单元格会跳到右侧字段栏里对应的字段并聚焦;
表或连接不可编辑时,双击改为打开快速查看。
各种内容分别怎么显示
| 内容类型 | 显示 | 理由 |
| 普通文本 | 原样,超出列宽省略 | — |
NULL | 灰斜体 NULL | 和空字符串区分开 |
| 数字 | 右对齐 | 方便比大小 |
布尔(tinyint(1)) | 0 / 1 | 偏好了可改成复选框 |
| 日期时间 | 原样显示服务器返回的文本 | 不做时区转换,避免看错 |
| 超长文本 | 截断 + … | 一页几十个 1 MB 的格子会卡死 |
| BLOB / 二进制 | «BLOB 12.3 KB» / 0xDEADBEEF | 二进制没法当文本看 |
| 图片二进制 | «图片 PNG 45.2 KB» | 能识别出来的话直接说明是图片 |
| 几何类型 | «GEOMETRY 25 B» | 同样不解析 |
| JSON | 一行紧凑显示 | 不自动美化——美化过的 JSON 和实际存的值不一样,会误导 |
| 空字符串 | 一格空白 | 和 NULL 区分 |
| 已修改 | 橙色底色 | 见第 4 章 |
| 新增的行 | 整行绿色底色 | 见第 4 章 |
| 已删除的行 | 整行删除线并变淡 | 见第 4 章 |
超长内容的延迟加载
超过 4 KB 的文本和二进制列,打开表时只取前 4 KB。状态栏会告诉你实际有多大
(比如 内容 1.2 MB)。选中该行(字段栏要展示完整值)、点「快速查看」或开始编辑某个字段时,
才会去服务器取这一行的完整值,中间会有一小段 loading。
如果表没有主键或唯一键,就没办法准确定位到这一行,这些单元格会一直保持截断状态,
并提示 无法定位行以加载完整内容。
右侧字段栏
选中一行后,右边会出现一条「字段栏」,把这行的所有列按表定义的顺序纵向列出来。
它是表数据视图里唯一能改数据的地方:网格负责看,字段栏负责改。
图 3-2 右侧字段栏。网格负责看,字段栏负责改;改过的字段橙色带小三角,网格里同步标记。
| # | 元素 | 含义 |
| 1 | 搜索字段 |
按列名过滤字段。输入时只显示命中的字段。 |
| 2 | 字段计数 |
没有过滤时显示总数,例如 18 个字段;过滤后显示 显示 3 / 18。 |
| 3 | 列名 + 类型 |
列名按表定义的顺序排列。主键列带 🔑 并加粗;类型用灰色小字写在右侧,例如 varchar(255),只读。 |
| 4 | 值编辑框 |
字段栏里唯一能改数据的地方。点进去就能编辑;失焦或按 ↩ 写入暂存区,Esc 放弃。 |
| 5 | ∅ 设为 NULL |
在 NULL 与上一个非 NULL 值之间切换。字段本来就是 NULL 时按钮呈按下状态。 |
| 6 | 已修改标记 |
改过的字段橙色底色 + 左上角小三角;网格里对应的单元格与行号列同时出现相同标记,直到提交或放弃。 |
| 7 | 加载完整内容… |
这一行的大字段合计超过 8 MB 时不自动取,点它才去服务器取完整值。 |
| 8 | 焦点行 |
字段栏始终跟随网格的焦点行:点哪个单元格,字段栏就显示它所在的那一行。 |
| 9 | 拖拽边界 |
字段栏宽度可拖拽(260–560pt,默认 320pt),按表记住。用工具栏最右的 ▤ 按钮或菜单「视图 → 显示 / 隐藏右侧字段栏」开关。 |
显示规则
- 字段按表定义的列顺序排列,不受网格列显隐与列顺序影响:被列过滤器隐藏的列,在这里照样显示。
- 列名旁边是完整类型(
varchar(255)、int unsigned、decimal(10,2)),类型只读,不做类型转换。
- 主键字段的列名前带
🔑,列名加粗。
- 值按上一节的规则呈现(
NULL、«BLOB 12.3 KB»、图片、JSON 等)。
- 顶部搜索框按列名过滤;过滤时计数显示成
显示 3 / 18。
编辑
- 每个字段的值就是一个编辑器,点进去就能改;编辑器按列类型自动选择(见第 4 章 §3)。
- 失焦或按 ↩ 把值写进暂存区,不会立刻落库;Esc 放弃本次输入,恢复原值。
- Tab / ⇧Tab 在字段之间移动。
- 校验失败时输入框抖动并保持编辑状态,值不写入暂存区。
- 改动过的字段橙色底色 + 左上角小三角;网格里对应的单元格与行号列同时出现相同标记。
- 同一行改了多个字段,提交时合为一条
UPDATE。
- 每个字段右侧的
∅ 按钮,点一下在 NULL 与上一个非 NULL 值之间切换。
大字段
- 选中一行时,字段栏要把值展示完整:超过 4 KB 的列会在选中行后自动去服务器取这一行的完整值(短暂 loading)。
- 如果这一行的大字段合计超过 8 MB,就不自动取,改为在字段旁显示「加载完整内容…」按钮,点一下才取。
- 表没有主键或唯一键时无法定位行,大字段保持截断,并提示
无法定位行以加载完整内容。
各种情况下的表现
| 情况 | 字段栏里显示什么 |
| 没有选中行 | 选中一行以查看和编辑它的字段 |
| 选中多行 | 已选中 12 行 · 请只选一行(不显示字段列表) |
| 选中的行已标记删除 | 字段全部只读,顶部显示 这一行已标记删除 与「撤销删除」 |
| 选中的是新增行 | 字段全部为空,可以直接填;顶部标注 新增行 |
| 表或连接不可编辑 | 字段正常显示但编辑器禁用,顶部写明原因(视图不可编辑、该连接处于只读模式 等) |
开关与宽度
- 默认显示。用工具栏最右的
▤ 按钮,或菜单「视图 → 显示 / 隐藏右侧字段栏」切换;没有快捷键。
- 宽度可拖拽(260–560pt,默认 320pt),按表记住。
- 字段栏只在表数据标签里出现;查询结果、表结构、对象定义标签没有它。
分页
表数据是分页加载的,默认每页 300 行。打开一张百万行的表不会把一百万行都拉下来。
图 3-3 分页控件。行数是估算的,所以前面写「约」。
| # | 控件 | 作用 |
| 1 | 行数范围 |
显示当前页是哪几行,以及总行数的估算值。估算靠读取表的统计信息,很快但可能不准,所以标了「约」。估不出来时显示 约 0 行(估算不可靠)。 |
| 2 | 页码 |
当前是第几页。换排序、换过滤条件、换每页行数都会回到第 1 页。 |
| 3 | 翻页按钮 |
‹ 上一页,› 下一页。在第一页或最后一页时对应按钮变灰。后面还有个「跳到第 __ 页」的输入框。 |
| 4 | 精确统计 |
点它才真正执行一次 COUNT(*)。大表可能很慢,期间可以取消。打开表时绝不会自动做精确计数。 |
| 5 | 每页行数 |
可选 100 / 300 / 1000 / 5000,也可以手动填,上限 10000。 |
翻到很深的页会越来越慢
偏移量超过 10 万行时,会提示:偏移量很大,翻页会越来越慢;建议用过滤器缩小范围后再翻页。
这不是本工具的问题,而是 LIMIT ... OFFSET ... 本身就要扫过前面所有行。
想看后面的数据,用过滤器或者排序更实际。
排序
图 3-4 排序的三种状态,以及按住 ⇧ 追加多列排序。
| 操作 | 结果 |
| 点列头 | 升序 ▲ → 降序 ▼ → 取消排序,循环 |
| ⇧ + 点列头 | 追加进排序列表,表头上显示序号 |
| 取消排序 | 回到默认顺序(按主键) |
| 改变排序 | 回到第 1 页并重新从服务器加载 |
快速查看
对内容很大或结构化的单元格,可以在一个可调整大小的浮层里看完整内容。
三种打开方式:选中单元格按 Space、中键点击、右键 → 快速查看。
图 3-5 快速查看的四种呈现方式。按 Esc 关闭。
| 类型 | 呈现方式 |
| JSON | 格式化并支持折叠展开 |
| 长文本 | 等宽字体 + 行号 + 查找 |
| 二进制 / BLOB | 十六进制预览(前 64 KB)+ 文件类型识别 + 「导出为文件…」 |
| 图片 | 直接显示图片 + 「导出为文件…」 |
| 日期时间 | 原文 + 按本地时区解析出来的结果 |
复制
图 3-6 右键的「复制为」子菜单。下面两种格式是实际输出的样子。
| 菜单项 | 输出内容 |
| 复制单元格值 | 纯文本 |
| 复制行 | 一行,制表符分隔 |
| 复制选中行 | 多行,制表符分隔 |
| 复制整列的值 | 每行一个值 |
| 复制列名 | 逗号分隔 |
| 复制为 JSON | JSON 数组对象 |
| 复制为 Markdown 表格 | 带表头与分隔线 |
| 复制为 CSV | 按偏好设置的分隔符 |
| 复制为 CSV(含表头) | 同上 + 首行表头 |
| 复制为 SQL INSERT | 可直接执行的插入语句 |
| 复制表结构 | 建表语句 |
选择与键盘导航
| 操作 | 效果 |
| 单击单元格 | 选中这个格子;右侧字段栏始终跟随「焦点行」,切到它所在的那一行 |
| 拖动 / ⇧ + 点击 | 选中一个矩形区域 |
| 点行号 | 选中整行 |
| ⌘ + 点行号 | 多选不连续的行;此时字段栏不显示字段列表,提示 请只选一行 |
| ↑↓←→ | 移动选中的单元格 |
| ⌘← / ⌘→ | 跳到首列 / 末列 |
| ⌘↑ / ⌘↓ | 跳到当前页的首行 / 末行 |
| ⌘C | 按上一节的格式复制 |
| Space | 快速查看当前单元格 |
| ⌘= / ⌘- | 增大 / 减小字号 |
列宽与列显隐
- 拖列头之间的分隔线可以改列宽,宽度会记住,下次打开同一张表恢复。
- 第一次打开时按内容自动估算列宽,上限 400pt。
- 显示哪些列由列过滤器控制(⌥⌘F),见第 5 章。
- 列的鼠标悬停提示里会显示完整类型,例如
`content` LONGTEXT NULL。
没有主键的表
直接置为只读
如果一张表既没有主键也没有可用的唯一键,那么每一行都无法被可靠地定位。
此时数据仍然可以浏览,但表格进入只读状态:
- 不能在网格里改值,也不能插入、不能删除
- 右侧字段栏也变成只读——只能看,不能改
- 双击单元格改为打开快速查看,而不是跳到右侧字段栏去编辑
- 超长内容一直保持截断(因为无法定位行去取完整值)
- 状态栏写明原因:
该表没有主键或唯一键,分页顺序不保证,且不可编辑
刷新
- ⌘R 重新加载当前页。
- 刷新会把大字段的临时缓存清掉——之前点开看过的完整内容会重新变回截断状态。
- 刷新不会丢弃未提交的改动;如果有未提交改动,刷新前会先问你。
性能预期
| 场景 | 目标 |
| 打开一张 100 万行的表(默认分页) | 500 毫秒内显示首屏 |
| 滚动 | 稳定流畅 |
| 切换分页 | 1 秒内(受服务器与网络影响) |
| 字段栏里编辑到界面反馈 | 立刻,无等待 |