mysql 命令行客户端使用经验

七阶子
9 min, 1627 words

归类: 工具使用

标签: mysql

首先,Linux 命令行工具,最基本的原则是随时可查手册,man mysql。 当用 mysql 命令从 shell 进入交互环境时,也可用 help 查询基本命令:

mysql> help

大多以 \ 前缀的转义命令,即可以单独使用,也可以附加在普通查询命令末尾。 有些大写转义命令打开某功能选项,而小写关闭对应的功能。

记录使用日志

将查询输出额外保存到外部文件,当作使用日志,这或有妙用。用 \T 命令可达成此效 果,类似于 tee 命令。使用 \t 关闭输出日志。

mysql> \T tee.log

也可以在 shell 启动 mysql 时添加 --tee 选项指定输出日志文件:

$ mysql --tee=file.log

如果日常工作频繁依赖使用 mysql ,还可以写个 shell 包装脚本,按当天日期为名记录 不同的输出日志文件。例如,将以下脚本保存为 ~/bin/tsql.sh

#! /bin/bash
LOGDIR=$HOME/mysql
cd $LOGDIR
today=$(date +%Y%m%d)
LOGFILE=tee.log.$today
exec mysql -u $USER -p$PASS -h $HOST --tee=$LOGFILE "$@"

当然,你可以自己选择是否为了方便将用户名、密码及服务器地址等信息一并写到该启动 脚本,抑或是为了安全还是从命令行提示符中输入。

控制查看结果

在交互命令中使用的查询,输出结果将以整洁的表格线给出,相信使用过 mysql 的用户 都习以为常了。这在查询的列数较少,可以在终端屏幕宽度内打印时很方便。但在列数很 多或有些文本字段内容过长时,就很难看了。这时可以用 \G 命令将结果以纵向的方式 输出,例如:

mysql> SELECT * FROM table_name WHERE ... LIMIT 1 \G

语句末尾使用 \G 后,不需要额外加分号 ; 直接回车即可,且只影响当前查询语句 。此后用分号结尾的语句,仍然按表格线的方式列出。

由于每个字段打印为一行,结果会比较长,故适合查询多列而不太适合查询多条记录。 除了有 WHERE 子句限定选择结果外,还可用 LIMIT 语法限定选出数量。

这个 LIMIT 1 还可作为查看表结构示例的语法,与 descshow create table 各有特色。而且,后者的输出内容较长,最好也用 \G 方式:

mysql> SHOW CREATE TABLE table_name \G

当真的需要以表格化查看太多查询记录时,还可以选择使用其他 pager 工具查看,典型 的如 less 便于上下翻页:

mysql> SELECT * FROM table_name WHERE ... \P less

此时将启用 less 全屏查看结果,浏览完毕后按 q 命令退出 less 重回到 mysql 交互界面。\P 命令选择外部 pager 是长效的,此后的查询结果也会启用外部 pager ,因此不需要这样时用 \n 禁用,或用在 \P 命令后留空不加 pager 参数,二次回 车确认后,将 pager 设为无,也就用 stdout

一个更复杂也更人性化的 pager 命令是:

mysql> pager less -n -i -S -F -X

这就涉及 man less 学习 less 的高级用法了。这些选项控制的效果有:-S 使长表 格线不折行,可用左右方向键浏览;-FX 则是智能判断输出记录结果,如果不超过一屏 ,就直接显示,不按正常启动 less 。

mysql 也有单行命令模式,即在启动时用 -e 选项指定要执行的 sql 语句,则 mysql 在启动后只执行该语句后立即退出,不进行交互模式。这既可以直接在 shell 命令行中 执行少量 sql 语句,也可以嵌入在 shell 脚本中批量执行特定几个 sql 语句。可以在 一个 -e 选项参数中以 ; 分隔多条 sql 语句,也可以用多个 -e 选项。最好将整 个 sql 语句用单引号括起作为 -e 的参数传给 mysql 。这是另一个话题了。

如果直接在 shell 命令行使用单行命令,结果输出到终端的标准输出,默认方式也是表 格化的。如:

$ mysql -e 'SELECT * FROM ... WHERE ...'

但是如果将 mysql -e 的结果重定向至文件或管道至其他程序时,默认的表格列输出是 没有表格线的,而只有 \t 制表符,这是便于程序处理而不是让人眼查看的考虑。不过 可以再加 -t 选项仍然输出表格线,如:

$ mysql -te 'SELECT * FROM ... WHERE ...' | less

当然了,可以在单引号内的 sql 语句末尾加 \G 改用纵向输出,不管是直接输出至终 端还是管道重定向。

命令行编辑

在 mysql 交互界面中编辑命令行与 shell 类似,都是基于 emacs 的快捷键。

清除命令 \c 有个用处是,仍将当前编辑的(不完整或有错误的)语句保存在历史,此 后仍可用 Ctrl-p 调入该命令,在此基础上修改。而如果用 Ctrl-U 真实地清空当前 命令行,则不会记入历史命令。你也不该企图用 Ctrl-C 取消当前 sql 语句命令,因 为那其实是退出 mysql 程序本身的。

如果在输入 sql 语句时,输到一半发现该语句太复杂,则用附加 \e 命令回车调用外 部编辑器(环境变量 $EDITOR ,一般是 vi)来编辑这条语句,编辑完后比如用 :wq 退出编辑器回到 mysql 执行。如果直接在行首使用 \eedit 命令,将编辑上一 条历史命令。

对于真正复杂且常用的 sql 语句,还可保存在外部文件,然后从 mysql 命令行中使用 source\. 命令来加载执行外部 sql 文件。注意记得从 shell 启动 mysql 的当 前路径。

在非交互模式下,也可以用定向输入 sql 文件,这也相当于将不适合 -e 直接输入的 语句先存于外部文件。

$ mysql ... < input.sql

小结

虽然 mysql 有很多功能强大的 GUI 工具,但似乎不能完全替代命令行客户端工具。笔者 虽然也装了 GUI 客户端,但只偶尔打开,最常用的还是命令行。所以本文归纳了若干使 用 mysql 命令行客户端程序的小技巧。