MySQL控制台中有些东西让我发疯。当我按ctrl + c取消正在键入的当前命令时,终端退出。

在我知道的每个终端(*nix终端,PythonPostgreSQL)中,ctrl + c都会取消当前命令,而ctrl + d退出终端。

此问题已在2003年报告,此后多次发生。

是否有办法:


更改此行为,还是
说服MySQL开发团队这真的很烦人?


#1 楼

要更改行为,请下载mysql CLI的源代码,并修改SIGINT处理程序以使其符合您的期望,然后重新编译并安装。

评论


这不是潜在危险吗?无法保证它将在将来的版本中使用。另外,它看起来像是可以使用,但是您怎么知道以后在完全不相关的地方不会出现一些奇怪的行为呢?

–起搏器
2015年1月10日14:19



#2 楼

至少客户端的5.6.14版本具有--sigint-ignore选项,以完全忽略SIGINT处理程序。它似乎是在2004年10月7日添加的-至少已经有一段时间了。我刚刚对其进行了测试,它确实可以阻止CTRL-C取消MySQL客户端。但是,如果CTRL-C也像在BASH Shell上一样取消当前的命令行缓冲区,那就好了-就像PostgreSQL CLI一样。我对MySQL进行了分叉,以了解实现此类事情的难度。如果准备就绪,我会发布带有tarball链接的Homebrew公式。<​​br />
UPDATE 1
曾经有过哪一天?我创建了承诺的补丁,然后决定创建一个视频来演示它。有效!但是,我无法禁用它!好吧,事实证明,MySQL实际上在去年将功能引入了核心客户端!是的,此问题的A至少要下载MySQL 5.7.3-794-g901d27f的客户端。它具有我们都想要的功能。

示例
从命令行中只需添加--sigint-ignore标志:

mysql --host=127.0.0.1 --port=8900 --user=root -p --sigint-ignore DBNAME


或者,像我一样,在$HOME/.my.cnf(在Windows上为%USERPROFILE%/.my.cnf)上为您的用户帐户创建一个MySQL配置文件,其内容如下:

[mysql]
sigint-ignore=TRUE


所有mysql执行都忽略了烦人的Ctrl-C并表现得像一个好的SQL客户端。

#3 楼

尽管ctrl + c行为令人讨厌,但是您仍然可以使用\c取消当前查询。您只需训练自己,即使用mysql CLI时,使用\c而不是ctrl + c!

评论


谁想到了这个主意?我们要他的头。

–起搏器
2015年1月10日14:21

您还可以使用Ctrl + U删除到该行的开头,并使用Ctrl + W删除向后一个单词。

– Damien Bezborodow
16年2月2日在4:13

#4 楼

好消息:#66583终于修复了MySQL的^ C功能。

从5.7.0更改日志中:


以前,mysql中的Control + C被中断了当前语句if
是否有一个,否则退出mysql。现在,Control + C会中断当前的
语句(如果有的话),或者取消任何部分输入行
,但是不会退出。


评论


我正在使用5.6.35并验证这不是问题。

– flow2k
17年9月25日在18:49

#5 楼

您正在使用哪个版本的客户端?我记得这是较旧的行为,但是最新版本的5.1和5.5似乎只是取消了正在运行的命令而没有退出客户端。再有可能是我使用的是Percona版本。如果是这种情况,您可以尝试仅运行他们的客户端。

评论


嗯,我正在运行5.5 Percona,并且ctrl + c仍会中止mysql客户端(不是当前的sql命令)

–德里克·唐尼(Derek Downey)
2012年7月9日15:19

我想我误读了OP。我的回应是针对正在执行的命令,而不是想让您尚未运行的命令空白。

– atxdba
2012年7月9日15:23



我同意@atxdba-我也正在运行5.5的Percona构建,并且ctrl + c退出当前正在执行的命令。如果没有命令在执行,它将退出CLI。可能是ctrl + d从正在运行的外壳中退出,但是如果您在外壳中运行了脚本,则在您按ctrl + c时它将停止...针对不同应用程序/外壳/脚本的不同命令!可能会令人困惑...:〜s

–戴夫·里克斯
2012年7月9日在15:38

@DaveRix我也同意,ctrl + c退出当前正在执行的查询。但是不幸的是,这并不是OP的目的。

–德里克·唐尼(Derek Downey)
2012年7月10日下午13:55