Консоль MySQL: Ctrl + C сводит меня с ума

24

В консоли MySQL есть что-то, что сводит меня с ума. Когда я нажимаю ctrl+, cчтобы отменить ввод текущей команды, терминал завершается.

В каждом терминале я знаю ( *nixтерминалы Python, PostgreSQL), ctrl+ cотменяет текущую команду и ctrl+ dвыходит из терминала.

Эта проблема была зарегистрирована в 2003 году , и с тех пор несколько раз сталкивалась.

Есть ли способ:

  • Изменить это поведение или
  • Убедить команду разработчиков MySQL, что это действительно раздражает?
Адам Матан
источник

Ответы:

6

Чтобы изменить поведение, загрузите исходный код для mysql CLI и измените SIGINTобработчик так, чтобы он вел себя так, как считаете нужным, а затем перекомпилируйте и установите.

Philᵀᴹ
источник
1
Разве это не опасно? Там нет гарантии, что это будет работать для будущих версий. Кроме того , похоже, что это сработает, но как вы узнаете, что позже у вас не будет странного поведения в совершенно не связанном месте?
Пейсер
21

По крайней мере, версия 5.6.14 клиента имеет опцию --sigint-ignore, чтобы полностью игнорировать обработчик SIGINT. Похоже, что он был добавлен 7 октября 2004 года, так что, по крайней мере, прошло какое-то время. Я только что протестировал его, и он не дает CTRL-C отменить клиент MySQL. Однако было бы неплохо, если бы CTRL-C также отменял текущий буфер командной строки, как это происходит в оболочке BASH - как это делает CLI PostgreSQL. Я разветвлял MySQL, чтобы понять, насколько сложно реализовать такую ​​вещь. Я опубликую формулу Homebrew со ссылкой на tarball, когда / если она будет готова.

ОБНОВЛЕНИЕ 1 У вас когда-нибудь был один из этих дней? Я создал обещанный патч , а затем решил создать видео для его демонстрации. Это сработало! Однако я не смог отключить его! Что ж, получается, что MySQL фактически запекся по функциональности для основного клиента в прошлом году ! Да, ответом на этот вопрос является загрузка клиента MySQL 5.7.3-794-g901d27f как минимум. У него есть функциональность, которую мы все желали.

ПРИМЕР. Из командной строки просто добавьте флаг --sigint-ignore:

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

Или сделайте, как я, и создайте конфигурационный файл MySQL для вашей учетной записи пользователя $HOME/.my.cnf( %USERPROFILE%/.my.cnfв Windows) со следующим содержимым:

[mysql]
sigint-ignore=TRUE

Это гарантирует, что все mysqlисполнения игнорируют надоедливый Ctrl-C и ведут себя как хороший клиент SQL.

akutz
источник
19

Пока поведение ctrl+ cраздражает, вы все равно можете использовать его \cдля отмены текущего запроса. Вам просто нужно потренироваться, что при использовании mysql CLI вы используете \cвместо ctrl+ c!

Дерек Дауни
источник
1
Кто тот парень, который придумал эту идею? Мы хотим его голову.
Пейсер
1
Вы также можете использовать Ctrl + U, чтобы удалить начало строки, и Ctrl + W, чтобы удалить одно слово назад.
Дэмиен Ó Селлай
9

Хорошая новость: функциональность MySQL ^ C наконец исправлена # 66583 .

Из журнала изменений 5.7.0 :

Ранее Control + C в mysql прерывал текущий оператор, если таковой был, или выходил из mysql, если нет. Теперь Control + C прерывает текущий оператор, если таковой был, или отменяет любую частичную строку ввода в противном случае, но не завершает работу.

Дэмиен Ó Келлай
источник
Я использую 5.6.35 и убедился, что это не проблема.
flow2k
1

Какую версию клиента вы используете? Я помню, что это старое поведение, но последние версии 5.1 и 5.5, похоже, просто отменяют команду выполнения, не выходя из клиента. С другой стороны, может быть, я использую сборки Percona. Вы можете попробовать запустить их клиент, если это так.

atxdba
источник
хм, я использую 5.5 Percona и ctrl + c по-прежнему прерывает MySQL-клиент (не текущая команда sql)
Дерек Дауни
Я думаю, что неправильно прочитал ОП. Мой ответ касался команды, которая находилась в процессе выполнения, а не желания очистить вас от еще не выполненной команды.
atxdba
Я согласен с @atxdba - я также использую сборку Percona версии 5.5, и ctrl + c выпадает из текущей выполняемой команды. Если команда не выполняется, она выпадает из CLI. Может случиться так, что ctrl + d выпадает из запущенной оболочки, но если у вас есть скрипт, работающий внутри оболочки, он остановится, если вы нажмете ctrl + c ... разные команды для разных приложений / оболочек / сценариев! Может сбивать с толку ...: ~ s
Дэйв Рикс
@DaveRix Я тоже согласен, Ctrl + C выпадает из запроса, который в данный момент выполняется. Но, к сожалению, это не то, о чем рассказывал ОП.
Дерек Дауни