七阶子博客: 杂文 | 游戏 | 戏剧 | 白蛇 | 文艺 | 编程 | 近期
请输入标题关键字或 yyyymmdd 格式的日期

    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
    

    待续