MySQL控制台:Ctrl + C让我发疯


24

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

在每一个终端我知道(*nix码头,PythonPostgreSQL),ctrl+ c取消当前命令和ctrl+ d离开终端。

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

有没有办法:

  • 更改此行为,或者
  • 说服MySQL开发团队这真的很烦人吗?

Answers:


6

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


1
这不是潜在的危险吗?无法保证它将在将来的版本中使用。另外,它似乎可以正常工作,但是您怎么知道以后在完全不相关的地方不会出现一些奇怪的行为呢?
Pacerier,2015年

21

至少客户端的5.6.14版本具有--sigint-ignore选项,以完全忽略SIGINT处理程序。它似乎是在2004年10月7日添加的 -至少已经有一段时间了。我刚刚进行了测试,它确实使CTRL-C取消了MySQL客户端。但是,如果CTRL-C也像在BASH shell上一样取消当前命令行缓冲区,那就好了-就像PostgreSQL CLI一样。我对MySQL进行了分叉,以了解实现此类事情的难度。如果准备就绪,我将发布带有tarball链接的Homebrew公式。

更新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%USERPROFILE%/.my.cnf在Windows上)为您的用户帐户创建一个MySQL配置文件,内容如下:

[mysql]
sigint-ignore=TRUE

这将确保所有mysql执行都忽略烦人的Ctrl-C并表现为良好的SQL客户端。


19

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


1
谁想到了这个主意?我们要他的头。
Pacerier,2015年

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

9

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

5.7.0更新日志中:

以前,如果存在,则mysql中的Control + C中断当前语句;否则,则退出mysql。现在,Control + C会中断当前的语句(如果有的话),否则将取消任何部分输入行,但不会退出。


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

1

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


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

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

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

@DaveRix我也同意,ctrl + c退出当前正在执行的查询。但是不幸的是,这并不是OP的目的。
德里克·唐尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.