本文介绍一些与客户端程序mysql
进行交互的技巧,这些技巧能帮助我们更有效率地使用它,减少文字输入。此外,还会描述“怎样更加方便地连接到服务器”,以及“如何在不经手工输入的情况下输入语句”。
简化连接过程
在启动mysql
程序时,通常都需要设定某些连接参数,如主机名、用户名或密码。如果在每次启动mysql
程序时都输入这么多的内容,那么你很快就会感到厌烦。其实,在连接MySQL服务器时,有好几种办法可以减少打字输入的需要。
- 把连接参数存储在一个选项文件里。
- 利用shell的历史命令功能输入重复命令。
- 利用shell别名或脚本定义一个
mysql
命令行快捷方式。
使用选项文件
MySQL允许把连接参数存储到一个选项文件里。这样,你就不用在每次启动mysql
时都输入这些参数了。它们的使用效果与在命令行上输入它们是一样的。这样做的好处在于,其他MySQL客户端程序(如mysqlimport
或mysqlshow
)也能使用这些参数。换句话说,选项文件不仅能简化mysql
的启动过程,也可以让许多其他程序受益。本节对“如何设置客户端程序所用的选项文件”进行了简要介绍。有关更多详细信息请参考F.2.2节。
在Unix系统上,可以创建一个名为~/.my.cnf的文件(即在你的主目录下创建一个名为.my.cnf的文件)来作为选项文件。在Windows系统上,可以在MySQL安装目录下或者在C盘根目录下,创建一个名为my.ini
的选项文件(如果在C盘根目录下,就是C:\my.ini
)。选项文件是一个纯文本文件,因此可以使用任何一种文本编辑器来创建。选项文件的内容近似如下:
[client]
host=server_host
user=your_name
password=your_pass
其中,[client]
行是client
选项组的开始标记。MySQL客户端程序会由该行开始读入各行,一直到文件末尾或遇到一个不一样的选项组起始标记为止,从而获得各个选项值。请把其中的server_host
、your_name
和your_pass
分别替换为你在连接MySQL服务器时所用的主机名、用户名和密码。例如,服务器运行在cobra.example.com
主机上,MySQL的用户名和密码分别是sampadm
和secret
,那么请在.my.cnf
文件里放入下面几行内容:
[client]
host=cobra.example.com
user=sampadm
password=secret
那个[client]
行是必需的,用于定义选项组的起始位置。不过,那些用来定义参数值的文本行都是可选的,你可以只列出所需要的那些参数值。例如,你使用的是Unix系统,并且MySQL用户名就是Unix的登录名,那么可以不用包含user
那一行。默认的主机是localhost
,因此如果你要连接的服务器运行在本地主机上,那么host
那一行也可以不要。
如果是在Unix系统上,那么在创建选项文件之后还需要为它设置访问权限,从而保证其他人不能读取和修改它。下面两条命令都可以实现让选项文件仅限你本人访问:
% **chmod 600 .my.cnf
**% **chmod u=rw,go-rwx .my.cnf**
利用shell的历史命令功能
有些shell程序,如tcsh
或bash
,能把你在命令行上输入过的命令记录在一个历史清单里,从而可以让你重复其中的命令。如果你使用的是这类shell程序,那么这个历史清单可以帮你避免输入整条的命令。例如,在你刚使用过mysql
之后,你可以像下面那样来执行它:
% **!my**
感叹号字符(!)的作用是告知shell程序,让它在命令历史清单里,把你最近执行过的以my
开头的命令找出来,再执行一次,就好像你在命令行上再次自己输入了它一样。有些shell程序还支持使用键盘上的上下箭头键(或组合键Ctrl+P和Ctrl+N)在命令历史清单里前后移动。这时,在当中选择一条命令之后,按Enter键即可执行它。tcsh
和bash
具有这样的功能,其他shell可能也有。如果你想了解更多如何使用历史命令列表的信息,可以查阅你所用的shell程序的帮助文档。
利用shell别名和脚本
如果shell程序支持别名机制,那么你可以将一个较短的命令名映射到一条较长的命令上。例如,在csh
或tcsh
里,你就可以像下面这样用alias
命令来创建一个名为sampdb
的别名:
alias sampdb 'mysql -h cobra.example.com -p -u sampadm sampdb'
bash
的语法稍有不同:
alias sampdb='mysql -h cobra.example.com -p -u sampadm sampdb'
利用别名定义之后,下面两条命令完全等价:
% **sampdb
**% **mysql -h cobra.example.com -p -u sampadm sampdb**
很明显,第一条命令比第二条简短很多。如果想让这个别名在你每次登录系统时都能生效,那么还需要把alias
命令放到shell程序的启动文件里(例如,tcsh
的启动文件是.tcshrc
,而bash
下的启动文件是.bashrc
或.bash_profile
)。
在Windows系统上,也有类似的技巧,即可以先创建一个快捷方式指向mysql
程序,然后再编辑该快捷方式的属性,让它包含相关的连接参数。
另一种能让你在调用命令时少打字的方法是,创建一个脚本,让它带着恰当的选项执行my``sql
。在Unix系统上,一个shell脚本与刚才定义的命令别名sampdb
是等价的:
#!/bin/sh
exec mysql -h cobra.example.com -p -u sampadm sampdb
如果把这个脚本命名为sampdb
,并将其设置为可执行的(使用chmod +x sampdb
命令),那么在命令提示符里输入sampdb
,即可启动mysql
,并连接到sampdb
数据库。
在Windows系统上,可以使用批处理文件来完成同样的事情。先创建一个名为sampdb.bat
的批处理文件,然后再把下面的内容放入其中:
mysql -h cobra.example.com -p -u sampadm sampdb
执行这个批处理文件的办法有两种:一种是在控制台窗口的提示符处输入sampdb
;另一种是双击这个批处理文件的Windows图标。
如果需要访问多个数据库或连接多个主机,那么你可以多定义几个别名、快捷方式或者脚本,每一个都以不同的选项参数来调用mysql
程序。
在调用命令时减少打字输入
从对数据库进行交互式查询的角度讲,mysql
是一个极其有用的程序,但其操作界面却主要适合于输入短小的单行查询命令。虽然mysql
自身并不关心输入的查询命令是否会延续多少行,但输入一条长长的查询命令却不是件让人高兴的事。如果因为语法错误而不得不重新输入一遍,那么肯定会让人更郁闷不已。有几种技术可以帮助我们减少不必要的录入工作。
- 利用
mysql
的输入行编辑功能。 - 利用复制和粘贴。
- 利用批处理运行
mysql
程序。
利用mysql
的输入行编辑器
mysql
程序支持输入行编辑。你可以编辑当前正在输入的那一行,也可以把以前的输入行调出来,直接再次输入它们,或者在进一步修改之后输入它们。当在输入的命令行中有打字错误的时候,使用这个功能会很方便:在按Enter键之前,可以把光标移到出错位置,对问题进行修正。如果你输入了一个有错误的查询命令,那么可以把它重新调出来,编辑修正问题,然后再次提交。(如果你是在一行里输入了整条查询命令,那么修改起来是最容易的。)
表1-4列出了一些适用于Unix系统的按键组合。
{-:-}表1-4 mysql
程序的输入编辑命令
按键组合 | 含 义 |
---|---|
向上键或Ctrl+P | 调出前一个输入行 |
向下键或Ctrl+N | 调出后一个输入行 |
向左键或Ctrl+B | 向左移动光标 |
向右键或Ctrl+F | 向右移动光标 |
Esc b | 把光标向后移动一个单词 |
Esc f | 把光标向前移动一个单词 |
Ctrl+A | 把光标移到输入行的开头 |
Ctrl+E | 把光标移到输入行的末尾 |
Ctrl+D | 删除光标位置上的那个字符 |
Delete | 删除光标前面(左侧)的那个字符 |
Esc D | 删除单词 |
Esc Backspace | 删除光标前面(左侧)的那个单词 |
Ctrl+K | 删除从光标位置到输入行末尾的所有内容 |
在Windows平台上,mysql
程序并没有提供行编辑功能。不过,Windows自身支持许多编辑命令,如表1-5所示,因此mysql
程序可以直接使用它们。
{-:-}表1-5 Windows的输入编辑命令
按键组合 | 含 义 |
---|---|
向上键 | 调出前一行 |
向下键 | 调出后一行 |
向左键 | 光标左移一个字符(后退) |
向右键 | 光标右移一个字符(前进) |
Ctrl + 向左键 | 光标左移一个单词 |
Ctrl + 向右键 | 光标右移一个单词 |
Home | 光标移动到行首 |
------------- | --------------------------------------- |
End | 光标移动到行尾 |
Delete | 删除光标处的字符 |
Backspace | 删除光标左边的字符 |
Esc | 删除整行 |
Page Up | 调出最早输入的命令 |
Page Down | 调出最后输入的命令 |
F3 | 调出最后输入的命令 |
F7 | 弹出命令菜单,用向上键/向下键选择 |
F9 | 弹出命令菜单,用命令编号选择 |
F8,F5 | 循环显示命令列表 |
下面的示例演示了一个输入行编辑功能的简单用法。假设你在mysql
程序里输入了如下所示的查询命令:
mysql> **SHOW COLUMNS FROM persident****;**
在按Enter键之前,你突然发现自己把president错拼成了persident,那么可以像下面这样修改这条查询命令。
(1)先按几次向左键,把光标左移到字符s的位置上。
(2)按两次Delete键或Backspace键(这两个键都可以删除光标左侧的字符),删除er。
(3)再重新输入re,修正错误。
(4)然后按下Enter键来执行该查询命令。
如果在按Enter键之后才发现打错了字,那么也不要紧。等到mysql
显示出错信息之后,按向上键调出刚才输入的那条查询命令,然后像刚才描述的那样将其修改好即可。
利用复制和粘贴来执行语句
如果你使用的是窗口化操作环境,那么可以把你认为有用的那些语句保存到某个文件里,其后通过复制和粘贴操作再次调用它们。
(1)在某个终端或控制台窗口里启动mysql
程序。
(2)在文档窗口里打开那个用来存放语句的文件。(例如,我在Unix系统上用vi
,在Windows系统上用gvim``。
)
(3)在这个文件里找到你想要执行的语句,选取并复制它。然后切换到终端窗口,把刚才复制的那条语句粘贴到mysql
程序里。
这一过程看起来比较繁琐,但在掌握之后却相当快捷。它提供了一种无需打字,即可快速输入命令的方式。稍加练习,即可熟练掌握。
你也可以将复制和粘贴的顺序反过来使用(把终端窗口里的语句复制粘贴到你的文件里)。在Unix系统上,当在mysql
里输入语句时,这些语句会被保存到位于主目录下的一个名为.mysql_history
的文件里。如果你手工输入了一条语句之后,想把它保存起来以供今后使用,那么可以这样做:先退出mysql
,再用一个编辑器打开.mysql_history
,然后将.mysql_history
里的语句复制粘贴到你的那个语句存档文件里。
利用mysql
执行脚本文件
mysql
程序并非只能在交互模式下运行,它也可以在非交互模式(即批处理)下从某个文件里读取输入。如果你有一些需要定期运行的语句,那么此方法会特别有用,因为你不用每次都来重新输入它们。只要在一个文件中保存一次这些语句,就可以根据需要反复地让mysql
执行它们。
假设你有一条查询命令,它可以通过member
表里的interests
列,将那些对某个特定时期的美国历史感兴趣的“美史联盟”成员找出来。例如,想要将那些对Great Depression(美国20世纪30年代的那个大萧条时期)感兴趣的成员找出来,那么可以编写出类似下面这样的查询命令:
SELECT last_name, first_name, email, interests FROM member
WHERE interests LIKE '%depression%'
ORDER BY last_name, first_name;
把这条查询命令保存在interests.sql
文件里,然后像下面这样将它提供给mysql
程序执行:
%** mysql sampdb < interests.sql**
默认情况下,当以批处理模式运行时,mysql
程序产生的输出内容是以制表符分隔的。如果想得到交互方式运行mysql``时输出
的格式效果,可以加上一个-t
选项:
% **mysql -t sampdb < interests.sql**
如果想把输出结果保存起来,那么可以将它重定向至一个文件:
% **mysql -t sampdb < interests.sql > ****interests.out**
如果已经运行了mysql
,那么可以通过source
命令来执行指定文件里的内容:
mysql> **source interests.sql**
如果需要将那些对Thomas Jefferson总统的生平感兴趣的成员查找出来,那么可以先编辑这个文件,把其中的depression
改为Jefferson
,然后再次运行mysql
即可。不过,这个方法只有在你不会频繁地使用这条查询命令时才会显现出优势来。如果要频繁地运行某条查询命令,那么需要另谋出路。在Unix系统上,有一种让查询命令变得更加灵活的方法:先把它保存为一个可以接受脚本命令行参数的shell脚本;然后,用这些命令行参数来更改查询命令的文本内容。这种参数化查询命令的方式,让你可以在运行脚本时指定interests
值。通过下面这个shell脚本interests.sh
,可以看出其中的工作原理:
#!/bin/sh
# interests.sh - find USHL members with particular interests
if [ $# -ne 1 ]; then echo 'Please specify one keyword'; exit; fi
mysql -t sampdb <<QUERY_INPUT
SELECT last_name, first_name, email, interests FROM member
WHERE interests LIKE '%$1%'
ORDER BY last_name, first_name;
QUERY_INPUT
其中的第3行用于确保命令行参数只有一个;否则,它就会输出一条简短的出错信息,然后退出执行。在<<QUERY_INPUT
和最后那个QUERY_INPUT
之间的所有内容,都会成为mysql
的输入。shell程序会把这段查询命令文本里的脚本变量$1
替换为源自命令行的那个参数(在shell程序里,变量$1
、$2、``...
依次对应于命令行里的各个参数)。这样,在运行这个脚本时,命令行的参数将成为这条查询命令中的检索关键字。
在运行该脚本之前,还必须把它设置为可执行的:
%** chmod +x interests.sh**
现在,你不用在每次运行这个脚本时都去编辑它了。只需通过命令行参数,告诉它你想查找什么东西即可:
% **./interests.sh depression
% **./interests.sh Jefferson**
你可以在sampdb
发行版的misc
目录里找到这个interests.sh
脚本。另外,在那里还提供了一个与之等效的Windows批处理文件interests.bat
。
{说明} 强烈建议大家不要把这类脚本安装在公共区域里,因为它们在执行时不会对参数进行安全检查,因而很容易遭遇SQL注入攻击。假设有人调用类似下面的脚本发起攻击:
******% ./interests.sh ****"****Jefferson****'****;DROP DATABASE sampdb;****"***
此脚本的后果是会有一条DROP DATABASE
语句被注入脚本语句中,成为mysql
的输入内容。如此一来,这条命令会真的被执行,其后果可想而知。
本文摘自《MySQL技术内幕》(第5版)预计7月6日左右上架
xiaotu.jpg
网友评论