Konsol MySQL: Ctrl + C membuat saya gila

24

Ada sesuatu di konsol MySQL yang membuat saya gila. Ketika saya menekan ctrl+ cuntuk membatalkan perintah yang sedang diketik, terminal keluar.

Di setiap terminal yang saya tahu ( *nixterminal Python,, PostgreSQL), ctrl+ cmembatalkan perintah saat ini dan ctrl+ dkeluar dari terminal.

Masalah ini telah dilaporkan pada tahun 2003 , dan bertemu beberapa kali sejak itu.

Apakah ada cara untuk:

  • Ubah perilaku ini, atau
  • Meyakinkan tim pengembang MySQL bahwa ini benar-benar menjengkelkan?
Adam Matan
sumber

Jawaban:

6

Untuk mengubah perilaku, unduh sumber untuk CLI mysql dan modifikasi SIGINTpawang untuk berperilaku sesuai keinginan Anda, kemudian kompilasi ulang & instal.

Philᵀᴹ
sumber
1
Bukankah ini berpotensi berbahaya? Tidak ada jaminan bahwa itu akan berfungsi untuk versi masa depan. Plus , sepertinya itu akan berhasil, tetapi bagaimana Anda tahu bahwa Anda tidak akan mendapatkan perilaku aneh di tempat yang sama sekali tidak berhubungan nanti?
Pacerier
21

Setidaknya versi 5.6.14 dari klien memiliki opsi --sigint-abaikan untuk benar-benar mengabaikan penangan SIGINT. Tampaknya sudah ditambahkan pada 7 Oktober 2004 - jadi setidaknya sudah ada beberapa saat. Saya baru saja mengujinya, dan itu membuat CTRL-C tidak membatalkan klien MySQL. Namun, alangkah baiknya jika CTRL-C juga akan membatalkan buffer baris perintah saat ini seperti pada BASH shell - seperti yang dilakukan PostgreSQL CLI. Saya telah bercabang MySQL untuk melihat betapa sulitnya untuk mengimplementasikan beberapa hal seperti itu. Saya akan memposting formula Homebrew dengan tautan tarball saat / jika sudah siap.

PEMBARUAN 1 Pernahkah mengalami salah satu dari hari-hari itu? Saya membuat tambalan yang dijanjikan , dan kemudian saya memutuskan untuk membuat video untuk mendemonstrasikannya. Berhasil! Namun, saya tidak bisa menonaktifkannya! Nah, ternyata MySQL sebenarnya dipanggang dalam fungsionalitas untuk klien inti tahun lalu ! Yap, A untuk Q ini adalah untuk mengunduh setidaknya klien MySQL 5.7.3-794-g901d27f. Ini memiliki fungsi yang kita semua inginkan.

CONTOH Dari baris perintah, tambahkan saja flag --sigint-diabaikan:

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

Atau, lakukan seperti yang saya lakukan dan buat file konfigurasi MySQL untuk akun pengguna Anda di $HOME/.my.cnf( %USERPROFILE%/.my.cnfpada Windows) dengan konten berikut:

[mysql]
sigint-ignore=TRUE

Ini akan memastikan bahwa semua mysqleksekusi mengabaikan Ctrl-C yang menjengkelkan dan berperilaku seperti klien SQL yang baik.

akutz
sumber
19

Meskipun perilaku ctrl+ cini mengganggu, Anda masih dapat menggunakan \cuntuk membatalkan kueri saat ini. Anda hanya perlu melatih diri Anda bahwa ketika menggunakan CLI mysql, Anda menggunakan \cbukannya ctrl+ c!

Derek Downey
sumber
1
Siapa pria yang menghasilkan ide ini? Kami ingin kepalanya.
Pacerier
1
Anda juga dapat menggunakan Ctrl + U untuk menghapus ke awal baris, dan Ctrl + W untuk menghapus satu kata ke belakang.
Damien Ó Ceallaigh
9

Berita baik: Fungsi MySQL C akhirnya diperbaiki oleh # 66583 .

Dari changelog 5.7.0 :

Sebelumnya, Control + C di mysql mengganggu pernyataan saat ini jika ada, atau keluar dari mysql jika tidak. Sekarang Control + C memotong pernyataan saat ini jika ada, atau membatalkan jalur input parsial jika tidak, tetapi tidak keluar.

Damien Ó Ceallaigh
sumber
Saya menggunakan 5.6.35 dan memverifikasi ini bukan masalah.
flow2k
1

Versi klien apa yang Anda gunakan? Saya ingat ini adalah perilaku yang lebih lama tetapi versi terbaru dari 5.1 dan 5.5 tampaknya hanya membatalkan perintah yang berjalan tanpa keluar dari klien. Kemudian lagi mungkin saya menggunakan build Percona. Anda dapat mencoba menjalankan klien mereka jika itu masalahnya.

atxdba
sumber
hmm, saya menjalankan 5,5 Percona dan ctrl + c masih membatalkan klien mysql (bukan perintah sql saat ini)
Derek Downey
Saya pikir saya salah membaca OP. Tanggapan saya adalah menanggapi perintah yang sedang dieksekusi, bukan keinginan untuk mengosongkan Anda, tetapi belum menjalankan perintah.
atxdba
Saya setuju dengan @atxdba - Saya juga menjalankan membangun Percona dari 5.5, dan ctrl + c keluar dari perintah yang sedang dijalankan. Jika tidak ada perintah yang dieksekusi, itu keluar dari CLI. Mungkin ctrl + d tetes keluar dari shell yang sedang berjalan, tetapi jika Anda memiliki script berjalan dalam shell, yang akan berhenti jika anda menekan ctrl + c ... perintah yang berbeda untuk berbagai aplikasi / shells / script! Dapat membingungkan ...: ~ s
Dave Rix
@DaveRix Saya setuju juga, ctrl + c tetes keluar dari query yang saat ini mengeksekusi. Tapi sayangnya bukan itu yang OP katakan.
Derek Downey