第 03 章浏览表数据

从对象树点一张表,就打开了它的数据视图。这一章讲表格长什么样、 右边那条「字段栏」怎么用、怎么翻页、怎么排序,各种奇怪的内容 (NULL、BLOB、超长文本、图片)分别怎么显示。

数据网格

数据网格 # 🔑 id name email content photo meta created_at 1 1 张三 zs@example.com 这是一篇很长的文… «图片 PNG 45.2 KB» «GEOMETRY 25 B» 2025-01-01 10:00 2 2 李四 ls@example.com «BLOB 12.3 KB» (空) {"a":1,"b":2} 2025-01-02 11:00 3 3 王五 NULL NULL NULL NULL 2025-01-03 4 4 赵六 zl@example.com 0xDEADBEEF «BLOB 4 B» user_id 42 2025-01-04 5 5 钱七 qq@example.com NULL NULL 2025-01-05 ↓ 行号列 · 主键列加粗且带钥匙图标 · 外键列带 ↗ 可跳转 `content` LONGTEXT NULL · 原始内容 1.2 MB 点开可查看完整内容(当前只取了前 4 KB) 1 2 3 4 5 6 7 8 9
图 3-1 数据网格。鼠标悬停在超长内容的单元格上,会弹出它到底有多大。
#元素含义
1行号列 最左边一列序号。点它可以选中整行; + 点击可以多选不连续的行。有已修改的行,行号上会带标记。
2主键列 表头带钥匙图标、列名加粗。有主键的表才可以编辑(见第 4 章)。
3外键跳转 ↗ 外键列的单元格后面带这个箭头。点一下会在新标签打开被引用的那张表,并自动只显示对应的那一行。
4NULL 灰色的斜体 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。

如果表没有主键或唯一键,就没办法准确定位到这一行,这些单元格会一直保持截断状态, 并提示 无法定位行以加载完整内容

右侧字段栏

选中一行后,右边会出现一条「字段栏」,把这行的所有列按表定义的顺序纵向列出来。 它是表数据视图里唯一能改数据的地方:网格负责看,字段栏负责改。

右侧字段栏 users # 🔑 id name email content photo created_at 1 1 张三 zs@example.com 这是一篇很长的… «图片 45.2 KB» 2025-01-01 2 2 李四 ls@example.com «BLOB 12.3 KB» NULL 2025-01-02 3 3 王五 NULL NULL NULL 2025-01-03 4 4 赵六 zl@example.com 0xDEADBEEF «BLOB 4 B» 2025-01-04 网格只读 · 双击单元格跳到右侧字段栏对应字段 搜索字段 18 个字段 🔑 id int unsigned 1 name varchar(255) 张三 email varchar(320) zs@example.com content longtext 这是一篇很长的文… 加载完整内容… 该行大字段合计 12.4 MB photo blob «图片 PNG 45.2 KB» created_at datetime 2025-01-01 10:00:00 字段按表定义列顺序排列,不受网格列显隐影响 宽度可拖拽(260–560pt),按表记住 1 2 3 4 5 6 7 8 9
图 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),按表记住。用工具栏最右的 按钮或菜单「视图 → 显示 / 隐藏右侧字段栏」开关。

显示规则

编辑

大字段

各种情况下的表现

情况字段栏里显示什么
没有选中行选中一行以查看和编辑它的字段
选中多行已选中 12 行 · 请只选一行(不显示字段列表)
选中的行已标记删除字段全部只读,顶部显示 这一行已标记删除 与「撤销删除」
选中的是新增行字段全部为空,可以直接填;顶部标注 新增行
表或连接不可编辑字段正常显示但编辑器禁用,顶部写明原因(视图不可编辑该连接处于只读模式 等)

开关与宽度

分页

表数据是分页加载的,默认每页 300 行。打开一张百万行的表不会把一百万行都拉下来。

分页控件 行 1–300 / 约 12,480 行 ↑ 估算值,前面标「约」 第 1 页 300 行/页 跳到 1 精确统计 100 行/页 300 行/页 1000 行/页 5000 行/页 也可以手填,上限 10000 1 2 3 4 5
图 3-3 分页控件。行数是估算的,所以前面写「约」。
#控件作用
1行数范围 显示当前页是哪几行,以及总行数的估算值。估算靠读取表的统计信息,很快但可能不准,所以标了「约」。估不出来时显示 约 0 行(估算不可靠)
2页码 当前是第几页。换排序、换过滤条件、换每页行数都会回到第 1 页。
3翻页按钮 上一页, 下一页。在第一页或最后一页时对应按钮变灰。后面还有个「跳到第 __ 页」的输入框。
4精确统计 点它才真正执行一次 COUNT(*)。大表可能很慢,期间可以取消。打开表时绝不会自动做精确计数
5每页行数 可选 100 / 300 / 1000 / 5000,也可以手动填,上限 10000。
翻到很深的页会越来越慢

偏移量超过 10 万行时,会提示:偏移量很大,翻页会越来越慢;建议用过滤器缩小范围后再翻页。 这不是本工具的问题,而是 LIMIT ... OFFSET ... 本身就要扫过前面所有行。 想看后面的数据,用过滤器或者排序更实际。

排序

列头排序 name 第 1 次点击:升序 name 第 2 次点击:降序 name 第 3 次点击:取消排序 status ▲1 created_at ▼2 按住 ⇧ 点列头,追加多列排序 取消全部排序后,回到默认顺序——按主键排。没有主键的表按什么顺序不保证。 换一种排序方式会回到第 1 页并重新加载数据。
图 3-4 排序的三种状态,以及按住 追加多列排序。
操作结果
点列头升序 ▲ → 降序 ▼ → 取消排序,循环
+ 点列头追加进排序列表,表头上显示序号
取消排序回到默认顺序(按主键)
改变排序回到第 1 页并重新从服务器加载

快速查看

对内容很大或结构化的单元格,可以在一个可调整大小的浮层里看完整内容。 三种打开方式:选中单元格按 Space、中键点击、右键 → 快速查看

快速查看 快速查看 · content JSON { ▾ "user": { "id": 42, "name": "张三" }, ▸ "tags": [3 项] "active": true, "score": null } 格式化显示,可以折叠展开 快速查看 · body 长文本 1 2 3 4 5 6 7 # 标题 这是一段很长的正文, 使用等宽字体显示, 左边带行号, 可以用 ⌘F 查找。 整个文件 1.2 MB, 这里是完整内容。 等宽字体 + 行号 + 查找 快速查看 · photo 二进制 PNG 图片 · 45.2 KB(当前预览前 64 KB) 00000000 89 50 4E 47 0D 0A 1A 0A .PNG.... 00000008 00 00 00 0D 49 48 44 52 ....IHDR 00000010 00 00 04 00 00 00 03 00 ........ 00000018 08 02 00 00 00 7B 1D 8B .....{.. 导出为文件… 快速查看 · avatar 图片 (这里显示真实图片) 图片 800 × 600 · PNG · 45.2 KB 导出为文件…
图 3-5 快速查看的四种呈现方式。按 Esc 关闭。
类型呈现方式
JSON格式化并支持折叠展开
长文本等宽字体 + 行号 + 查找
二进制 / BLOB十六进制预览(前 64 KB)+ 文件类型识别 + 「导出为文件…」
图片直接显示图片 + 「导出为文件…」
日期时间原文 + 按本地时区解析出来的结果

复制

右键复制菜单 快速查看 复制为 按此值筛选 排除此值 复制行 删除行 复制单元格值 复制行 复制选中行 复制整列的值 复制列名 复制为 JSON 复制为 Markdown 表格 复制为 CSV 复制为 CSV(含表头) 复制为 SQL INSERT 复制表结构 复制超过 100 行时会给出「已复制 12,480 行(2.1 MB)」的轻提示 复制为 Markdown 表格 → | id | name | email | | -- | ---- | ----- | | 1 | 张三 | zs@… | | 2 | 李四 | ls@… | 复制为 SQL INSERT → INSERT INTO `app_dev`.`users` (`id`,`name`,`email`) VALUES (1,'张三','zs@example.com'), (2,'李四','ls@example.com'); 二进制写成 0x… 十六进制 NULL 写成 NULL
图 3-6 右键的「复制为」子菜单。下面两种格式是实际输出的样子。
菜单项输出内容
复制单元格值纯文本
复制行一行,制表符分隔
复制选中行多行,制表符分隔
复制整列的值每行一个值
复制列名逗号分隔
复制为 JSONJSON 数组对象
复制为 Markdown 表格带表头与分隔线
复制为 CSV按偏好设置的分隔符
复制为 CSV(含表头)同上 + 首行表头
复制为 SQL INSERT可直接执行的插入语句
复制表结构建表语句

选择与键盘导航

操作效果
单击单元格选中这个格子;右侧字段栏始终跟随「焦点行」,切到它所在的那一行
拖动 / + 点击选中一个矩形区域
点行号选中整行
+ 点行号多选不连续的行;此时字段栏不显示字段列表,提示 请只选一行
移动选中的单元格
⌘← / ⌘→跳到首列 / 末列
⌘↑ / ⌘↓跳到当前页的首行 / 末行
⌘C按上一节的格式复制
Space快速查看当前单元格
⌘= / ⌘-增大 / 减小字号

列宽与列显隐

没有主键的表

直接置为只读

如果一张表既没有主键也没有可用的唯一键,那么每一行都无法被可靠地定位。 此时数据仍然可以浏览,但表格进入只读状态:

  • 不能在网格里改值,也不能插入、不能删除
  • 右侧字段栏也变成只读——只能看,不能改
  • 双击单元格改为打开快速查看,而不是跳到右侧字段栏去编辑
  • 超长内容一直保持截断(因为无法定位行去取完整值)
  • 状态栏写明原因:该表没有主键或唯一键,分页顺序不保证,且不可编辑

刷新

性能预期

场景目标
打开一张 100 万行的表(默认分页)500 毫秒内显示首屏
滚动稳定流畅
切换分页1 秒内(受服务器与网络影响)
字段栏里编辑到界面反馈立刻,无等待