Bagaimana cara terbaik menampilkan di Terminal a MySQL SELECT mengembalikan terlalu banyak bidang?


271

Saya menggunakan Putty untuk menjalankan:

mysql> SELECT * FROM sometable;

sometablememiliki banyak bidang dan ini menghasilkan banyak kolom yang berusaha ditampilkan di terminal. Bidang dibungkus ke baris berikutnya sehingga sangat sulit untuk berbaris judul kolom dengan nilai bidang.

Solusi apa yang ada untuk melihat data tersebut di terminal?

Saya tidak memiliki atau ingin akses ke phpMyAdmin - atau antarmuka GUI lainnya. Saya mencari solusi baris perintah seperti ini: Simpan hasil MySQL Query ke dalam teks atau file CVS


Solusinya bagi pengembang untuk memperbaiki bug yang menghentikan terminal diperluas ke lebih dari satu layar.
Burung hantu

@ Owl, apakah ini benar-benar bug? Apakah solusi yang diberikan di sini belum menyelesaikan masalah?
Gathide

Jawaban:


532

Hentikan permintaan dengan \G di tempat ; . Sebagai contoh:

SELECT * FROM sometable\G

Kueri ini menampilkan baris secara vertikal, seperti ini:

*************************** 1. row ***************************
                 Host: localhost
                   Db: mydatabase1
                 User: myuser1
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
*************************** 2. row ***************************
                 Host: localhost
                   Db: mydatabase2
                 User: myuser2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...

9
Meskipun Windows tidak peka terhadap huruf besar-kecil, ini Gharus ditulis dengan huruf besar .
Rafael Barros

3
Hanya untuk mengklarifikasi komentar di atas, ketika Anda mengetik SELECT * FROM sometable\GAnda mengirim string ke klien baris perintah mysql, bukan Windows, itulah sebabnya Gcase sensitive
Hurricane Hamilton

2
Kecuali itu tidak bekerja dengan baik dengan sejumlah besar catatan.
Błażej Michalik

1
Dokumentasi yang ditautkan mengatakan: "ego (\ G) Kirim perintah ke server mysql, tampilkan hasilnya secara vertikal. Berhati-hatilah dalam mendefinisikan pembatas yang mungkin terjadi dengan kata lain. Misalnya, jika Anda mendefinisikan pembatas sebagai X, Anda tidak akan dapat gunakan kata INDEX dalam pernyataan. "
Benjamin

Saya menemukan ini. Bisakah Anda memberi tahu saya cara memperbaikinya? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang

347

Anda juga mungkin menemukan ini berguna (non-Windows):

mysql> pager less -SFX
mysql> SELECT * FROM sometable;

Ini akan menyalurkan outut melalui lessalat baris perintah yang - dengan parameter ini - akan memberi Anda output tabular yang dapat digulir secara horizontal dan vertikal dengan tombol kursor.

Tinggalkan tampilan ini dengan menekan qtombol, yang akan keluar dari lessalat.


23
ini jenius. tip yang sangat baik. Sejak awal waktu saya menginginkan ini.
Richard H

60
dapat diatur ulang menggunakan nopager.
epeleg

3
Pencarian kurang dilakukan dengan menekan /dan kemudian menulis string pencarian, yang juga bisa menjadi regex, dan kemudian tekan enter. Cari maju dengan menekan ndan mundur dengan menekan N( Shift + n).
Krøllebølle

5
lessdapat melakukan hal-hal yang lebih keren. Menggunakan &Anda dapat memfilter (hanya menampilkan garis yang cocok) hasilnya lebih lanjut dengan menggunakan ekspresi reguler. Ini berfungsi selain /pencarian (yang masih akan menyebabkan penyorotan). Setel ulang filter dengan menekan &lagi dan kemudian cukup menekan Return.
Daniel Schneller

3
F akan berhenti lebih cepat, jika output sudah sesuai dengan layar. X adalah untuk mencegah kurang dari mencoba menghapus layar saat keluar. Lihat halaman manual lebih sedikit.
Daniel Schneller

46

Coba aktifkan mode vertikal, gunakan \Guntuk menjalankan kueri alih-alih ;:

mysql> SELECT * FROM sometable \G

Hasil Anda akan terdaftar dalam mode vertikal, sehingga setiap nilai kolom akan dicetak pada baris terpisah. Outputnya akan lebih sempit tapi jelas jauh lebih lama.


2
sebagai pelengkap \G, Anda juga dapat menggunakan \gsebagai pengganti untuk ;, saya tahu, siapa yang akan melakukan itu, tetapi itu memberikan konteks mengapa \Gworkd di tempat pertama.
santiago arizti

25

Menggunakan mysql's egoperintah

Dari mysql's helpperintah:

ego (\ G) Kirim perintah ke server mysql, tampilkan hasil secara vertikal.

Jadi dengan menambahkan a \Gke Anda select, Anda bisa mendapatkan output vertikal yang sangat bersih:

mysql> SELECT * FROM sometable \G

Menggunakan pager

Anda dapat memberi tahu MySQL untuk menggunakan lesspager dengan -Sopsi yang memotong garis lebar dan memberi Anda output yang dapat Anda gulir dengan tombol panah:

mysql> pager less -S

Jadi, lain kali Anda menjalankan perintah dengan output luas, MySQL akan membiarkan Anda menelusuri output dengan lesspager:

mysql> SELECT * FROM sometable;

Jika Anda selesai dengan pager dan ingin kembali ke output reguler stdout, gunakan ini:

mysql> nopager

2
Ini! Cantik, satu-satunya cara untuk membuat ini lebih sempurna adalah dengan memiliki cara untuk melihat seberapa jauh kolom melebar secara horizontal. Seperti bilah gulir. Namun demikian, solusi hebat.
Brandon Benefield

24

Anda dapat menggunakan opsi --tableatau -t, yang akan menampilkan serangkaian hasil yang terlihat bagus

echo 'desc table_name' | mysql -uroot database -t

atau metode lain untuk mengirimkan kueri ke mysql, seperti:

mysql -uroot table_name --table < /tmp/somequery.sql

keluaran:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| username     | varchar(30)  | NO   | UNI | NULL    |                |
| first_name   | varchar(30)  | NO   |     | NULL    |                |
| last_name    | varchar(30)  | NO   |     | NULL    |                |
| email        | varchar(75)  | NO   |     | NULL    |                |
| password     | varchar(128) | NO   |     | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |
| last_login   | datetime     | NO   |     | NULL    |                |
| date_joined  | datetime     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

8

Pager default adalah stdout. Stdout memiliki batasan kolom, sehingga output akan dibungkus. Anda dapat mengatur alat lain sebagai pager untuk memformat output. Ada dua metode. Satu untuk membatasi kolom, yang lain adalah untuk memprosesnya dalam vim.

Metode pertama:

  ~  echo $COLUMNS
179

mysql> nopager
PAGER set to stdout
mysql> pager cut -c -179
PAGER set to 'cut -c -179'
mysql> select * from db;
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| Host      | Db         | User       | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| %         | test       |            | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| %         | test\_%    |            | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| localhost | phpmyadmin | phpmyadmin | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| localhost | it         | it         | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
4 rows in set (0.00 sec)

mysql>

Outputnya tidak lengkap. Konten sesuai dengan layar Anda.

Yang kedua:

Setel mode vim ke nowrap di .vimrc Anda

  ~  tail ~/.vimrc

" no-wrap for myslq cli
set nowrap

mysql> pager vim -
PAGER set to 'vim -'
mysql> select * from db;
    Vim: Reading from stdin...
+-----------+------------+------------+-------------+-------------+----------
| Host      | Db         | User       | Select_priv | Insert_priv | Update_pr
+-----------+------------+------------+-------------+-------------+----------
| %         | test       |            | Y           | Y           | Y
| %         | test\_%    |            | Y           | Y           | Y
| localhost | phpmyadmin | phpmyadmin | Y           | Y           | Y
| localhost | it         | it         | Y           | Y           | Y
+-----------+------------+------------+-------------+-------------+----------
~
~
~

Ini bekerja paling baik bagi saya dalam wadah buruh pelabuhan ringan. pager cut -c -200. Jawaban yang lebih diterima di sini mengharuskan saya untuk mengunduh dependensi yang tidak perlu.
Gabriel Gates

7

Hanya untuk melengkapi jawaban yang saya pikir paling baik, saya juga menggunakan less -SFXtetapi dengan cara yang berbeda: Saya suka iklankan ke .my.cnffile saya di folder rumah saya, contoh file cnf terlihat seperti ini:

[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'

Hal yang baik tentang memilikinya dengan cara ini, adalah yang lesshanya digunakan ketika output dari sebuah query sebenarnya lebih dari satu halaman, berikut adalah penjelasan dari semua flag:

  • -S: Baris tunggal, jangan lompati baris ketika garis lebih lebar dari layar, alih-alih biarkan gulir ke kanan.
  • -F: Keluar jika satu layar , jika konten tidak perlu digulir maka cukup kirim ke stdout.
  • -X: Tidak ada init, menonaktifkan output apa pun yang "kurang" mungkin telah dikonfigurasi untuk menghasilkan setiap kali ia memuat.

Catatan: di .my.cnffile jangan menaruh pagerperintah di bawah [client]kata kunci; meskipun mungkin bekerja dengan mysqlbaik, mysqldumpakan mengeluh tentang tidak mengenalinya.


Perhatikan bahwa jika Anda menjalankan kueri "batas-kurang" pada tabel besar, Anda tidak akan melihat kekacauan yang disebabkan olehnya karena lessakan tetap berlabuh ke baris pertama dari output.
santiago arizti

2

Jika Anda menggunakan MySQL secara interaktif, Anda dapat mengatur pager Anda untuk digunakan sedseperti ini:

$ mysql -u <user> p<password>
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah 
.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"

Jika Anda tidak menggunakan sedpager, hasilnya seperti ini:

"blah":"blah","blah":"blah","blah":"blah"

1

Saya menulis pspg- https://github.com/okbob/pspg

Pager ini dirancang untuk data tabular - dan MySQL didukung juga.

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER disetel ke 'pspg -s 14 -X - force-uniborder --quit-if-one-screen'
MariaDB [sakila]> pilih sekarang ();
MariaDB [sakila]> pilih * dari batas nicer_but_slower_film_list 100;

0

Saya percaya dempul memiliki jumlah kolom maksimum yang dapat Anda tentukan untuk jendela.

Untuk Windows, saya pribadi menggunakan Windows PowerShell dan mengatur lebar buffer layar cukup tinggi. Lebar kolom tetap tetap dan Anda dapat menggunakan bilah gulir horizontal untuk melihat data. Saya memiliki masalah yang sama dengan yang Anda alami sekarang.

sunting: Untuk host jarak jauh yang harus Anda masukkan ke SSH, Anda akan menggunakan sesuatu seperti plink + Windows PowerShell


0

Anda dapat menggunakan teeuntuk menulis hasil permintaan Anda ke file:

tee somepath\filename.txt

-1

Menggunakan Prompt Perintah Windows Anda dapat meningkatkan ukuran buffer jendela sebanyak yang Anda ingin melihat jumlah kolom. Ini tergantung pada tidak adanya kolom dalam tabel.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.