第 06 章查询编辑器

⌘T 开一个查询标签。上半部分是写 SQL 的地方,下半部分是结果。 写多条语句时,每条语句的结果是一个独立的标签。

整体布局

查询编辑器布局 ▶ 执行 ⌘↩ ▶▶ 执行全部 ⇧⌘↩ 停止 ⌘. A− A+ 打开 另存为 只读模式见下 1 2 3 4 5 6 7 SELECT `id` , `name` -- 列出活跃用户 FROM `app_dev`.`users` WHERE `age` > 18 ; SELECT COUNT (*) FROM `orders` WHERE `status` = 'paid' ; -- 光标停在第 2 行时,第 1 条语句整段有淡背景 结果 1 结果 2 错误 ● 共 2 条 · 耗时 42 ms (结果网格只读) id name age email 1张三 24zs@example.com 2李四 31ls@example.com 3王五 19ww@example.com 4赵六 45zl@example.com 5钱七 22qq@example.com 已执行 2 条语句 · 耗时 42 ms · 返回 1,204 行 滚动条在右边 拖拽中间的分隔条可以调整编辑器与结果区的比例,比例会被记住。 结果区可以排序、调列宽、列显隐、复制、快速查看、导出,但——不能编辑。 只读模式下,工具栏会显示:只读模式:仅允许 SELECT / SHOW / EXPLAIN / DESC 1 2 3 4 5 6
图 6-1 查询标签的布局。光标停在第 2 行时,第 1 条语句整段带一层淡背景。
#控件作用
1编辑器工具栏 ▶ 执行跑光标所在语句(有选中就跑选中的);▶▶ 执行全部跑整个脚本;停止取消正在跑的查询;A− / A+ 临时调字号;打开 / 另存为读写 .sql 文件。
2行号 左边缘的行号栏。可以在偏好里关掉。
3当前语句背景 光标所在的那条语句会整段加一层淡背景,这样按「执行」之前你就知道会跑哪一段。可以在偏好里关掉。
4分隔条 上下拖拽调整编辑器和结果区的比例,比例会被记住。
5结果标签 每条语句一个标签。类型有结果 N(有返回行)、完成(非查询语句)、错误(失败)、只读拦截(被只读模式挡下)。超过 24 个会折叠。
6状态栏 显示执行了几条、总耗时、总返回行数。执行中这里会变成进度,右边出现「停止」。

语法高亮的配色

语法高亮配色 SELECT 关键字 COUNT 函数名 `users` 反引号标识符 'paid' 字符串 18 数字 -- 注释 注释 = <> ( ) , ; 操作符 @user_id 变量
图 6-2 高亮覆盖的记号类型。类型名本身(VARCHARINT)也算关键字。

编辑器能做什么、不能做什么

能做

  • 语法高亮(关键字、函数名、类型名、字符串、反引号标识符、数字、注释、变量、操作符)
  • 行号、当前语句整段高亮
  • 自动缩进:换行时保持上一行的缩进
  • Tab 插入 4 个空格(可在偏好里改)
  • 查找(⌘F 打开系统查找条)
  • 撤销 / 重做
  • 注释切换(⌘/)、缩进 / 反缩进

不做

  • 自动补全
  • SQL 格式化 / 美化
  • 多光标
  • 分屏
  • 表名字段的语义提示
智能引号必须关掉

在编辑器里输入 '"-- 时,绝不能被系统替换成弯引号 ()或长破折号()。这是 SQL 编辑器最容易踩的坑—— 一个弯引号会让整条语句语法错误,而且肉眼很难看出来。

因此系统的智能引号、智能破折号、拼写纠正在这个文本框里全部关闭。 如果你发现粘贴进去的 SQL 报语法错,先检查有没有被换成弯引号。

脚本自动保存

执行

执行范围

操作行为
⌘↩有选中内容 → 执行选中部分;没有选中 → 执行光标所在的语句
⇧⌘↩执行全部语句
工具栏「执行」右边的小箭头可以把 ⌘↩ 的默认行为改成「执行全部」,设置会被记住

语句按分号切分。字符串里、反引号里、注释里的分号不算分隔符;最后一段即使没有分号也算一条语句;空语句和纯注释段会被跳过。

执行中的样子

执行中的状态 正在执行 正在执行… 已接收 12,480 行(2.1 MB)(3.4 秒) 停止 结果边收边显示,不用等全部返回 58% 大结果 结果较大(已超过 10 万行),可随时停止 停止 停止后已经收到的部分结果会保留展示 执行完成 已执行 3 条语句 · 耗时 42 ms · 返回 1,204 行 停止后向服务器发送取消请求(KILL QUERY)。如果取消失败,会提示「取消失败,查询仍在服务器上运行」。
图 6-3 执行中、结果过大、执行完成三种状态栏。

出错时

结果展示

结果标签 结果 1 结果 2 完成 错误 ● 只读拦截 结果 N —— 一条查询,有返回行 id name 1张三 2李四 完成 —— 非查询语句,显示影响行数 影响 3 行 · 耗时 12 ms · last_insert_id = 42 INSERT / UPDATE / DELETE / DDL 都走这个面板 错误 —— 这条语句失败了 [错误 1064] SQLSTATE 42000 You have an error in your SQL syntax… 原文照贴,不翻译 只读拦截 —— 被只读模式挡下 UPDATE users SET name = 'x' WHERE id = 1; 当前连接处于只读模式,只能执行查询语句。 混合脚本里被拦截的语句不会中断后面的安全语句
图 6-4 四种结果标签。
标签文字含义
结果 N一条查询,有返回行
完成非查询语句,显示影响行数与 last_insert_id
错误该语句失败
只读拦截被只读模式拒绝

查询历史

左侧栏底部的 查询历史 入口,点开成一个独立标签。

查询历史 搜索 SQL 内容… 全部连接 今天 清空历史 14:32:07 42 ms 1,204 行 SELECT id, name FROM users WHERE age > 18; 14:31:55 3 ms UPDATE users SET name = 'x' WHERE id = 1; 昨天 18:02 812 ms 3 行 INSERT INTO orders (user_id, total) VALUES (42, 199); 昨天 17:40 15 ms 88 行 SELECT * FROM application_logs LIMIT 100; 选中的这条的完整 SQL SELECT `id`, `name`, `email`, `created_at` FROM `app_dev`.`users` WHERE `age` > 18 AND `status` = 'active'; 单击 → 在下方预览完整 SQL · 双击 → 插入到当前查询标签 · 右键 → 复制 / 在新标签打开 / 删除该条 只记录从 SQL 编辑器执行过的语句。分页、元数据读取这些客户端自动发的查询不会进来(它们在 Console Log 里)。
图 6-5 查询历史。默认保留最近 5000 条。
说明
记录范围只记录从 SQL 编辑器执行的语句。表分页、元数据读取这类客户端自动发出的查询不记录
搜索按 SQL 内容搜索;按连接过滤;按时间范围过滤
每条包含时间、成功 / 失败、耗时、返回行数或影响行数、完整 SQL
保留条数默认最近 5000 条
清空「清空历史」清当前连接的记录;按住 点击清空所有连接

Console Log

左侧栏底部的 Console Log 入口,同样是一个独立标签。它和查询历史的分工是:

查询历史

记录你写的语句,用来「找回上次那条 SQL」。

Console Log

记录所有发给服务器的语句,用来「搞清楚界面到底发了什么出去」。

Console Log 全部 全部 / 仅数据语句 / 仅元数据 复制 清空 保留最近 5000 条 14:32:07.123 data app_dev 42 ms 1204 行 SELECT `id`,`name` FROM `app_dev`.`users` ORDER BY `id` LIMIT 300 OFFSET 0; 14:32:06.998 meta app_dev 3 ms SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='app_dev' … 14:32:06.541 data app_dev ✗ 1064 SELECT * FORM users 14:31:59.002 data app_dev 0 ms START TRANSACTION; -- 提交改动时客户端自动发的 14:31:58.774 data app_dev 2 ms KILL QUERY 12345; -- 点「停止」时发出的取消请求 ↓ 回到底部
图 6-6 Console Log。[data] 是用户发起的,[meta] 是客户端自动发的。
说明
记录范围所有发给数据库的语句:元数据查询、分页查询、事务控制语句、取消查询的操作,全都在
两类标签[data] 用户发起的;[meta] 客户端自动发的
过滤全部 / 仅数据语句 / 仅元数据
展开每条可以展开看完整 SQL 与执行结果概要;失败的标红
保留条数最近 5000 条,更早的自动丢弃
持久化默认只在内存里,关掉 App 就没了。偏好里可以开「写入日志文件」
滚动默认跟随滚动到底部;你手动往上滚以后暂停跟随,并出现「回到底部」按钮

脚本文件

操作行为
⌘O打开 .sql / .txt 文件到新的查询标签
⇧⌘S当前脚本另存为
关闭标签如果关联过文件且有未保存改动 → 提示保存;纯草稿内容不提示

只读模式下的查询编辑器

连接处于只读模式时,执行前会检查每条语句的类型。写操作被拒绝,工具栏上会常驻一行提示:

只读模式:仅允许 SELECT / SHOW / EXPLAIN / DESC

混合脚本里,安全的语句正常执行,被拒绝的语句有一个标红的 只读拦截 标签, 而且不会中断后面安全语句的执行。完整规则见第 9 章

取消长查询