Làm cách nào để hiển thị tốt nhất trong Terminal một MySQL CHỌN trả về quá nhiều trường?


271

Tôi đang sử dụng PuTTY để chạy:

mysql> SELECT * FROM sometable;

sometablecó nhiều trường và điều này dẫn đến nhiều cột cố gắng được hiển thị trong thiết bị đầu cuối. Các trường bao bọc lên dòng tiếp theo, vì vậy rất khó để sắp xếp các tiêu đề cột với các giá trị trường.

Có những giải pháp nào để xem dữ liệu đó trong thiết bị đầu cuối?

Tôi không muốn truy cập vào phpMyAdmin - hoặc bất kỳ giao diện GUI nào khác. Tôi đang tìm giải pháp dòng lệnh như giải pháp này: Lưu kết quả Truy vấn MySQL vào tệp văn bản hoặc CVS


Giải pháp dành cho nhà phát triển là sửa lỗi dừng thiết bị đầu cuối được mở rộng ra rộng hơn một màn hình.

@Owl, đây có thực sự là một lỗi không? Các giải pháp được cung cấp ở đây chưa giải quyết được vấn đề?
Gathide

Câu trả lời:


531

Chấm dứt truy vấn với \G thay cho ; . Ví dụ:

SELECT * FROM sometable\G

Truy vấn này hiển thị các hàng theo chiều dọc, như thế này:

*************************** 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
Mặc dù Windows không phân biệt chữ hoa chữ thường, nhưng điều này Gphải được viết hoa.
Rafael Barros

3
Chỉ cần làm rõ nhận xét trên, khi bạn nhập, SELECT * FROM sometable\Gbạn đang gửi chuỗi đến máy khách dòng lệnh mysql chứ không phải Windows, đó là lý do tại sao Gtrường hợp nhạy cảm
Bão Hamilton

2
Ngoại trừ nó không hoạt động tốt với số lượng lớn hồ sơ.
Błażej Michalik

1
Tài liệu được liên kết cho biết: "ego (\ G) Gửi lệnh đến máy chủ mysql, hiển thị kết quả theo chiều dọc. Hãy cẩn thận về việc xác định một dấu phân cách có thể xảy ra trong các từ khác. Ví dụ: nếu bạn xác định dấu phân cách là X, bạn sẽ không thể sử dụng từ INDEX trong các câu lệnh. "
Benjamin

Tôi gặp phải điều này. Bạn có thể vui lòng cho tôi biết làm thế nào để sửa chữa nó? sh: 1: less: not found 44 rows in set (0.01 sec)
Quý Đường

346

Bạn cũng có thể thấy điều này hữu ích (chỉ dành cho Windows):

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

Điều này sẽ dẫn đường ra ngoài thông qua lesscông cụ dòng lệnh - với các tham số này - sẽ cung cấp cho bạn một đầu ra dạng bảng có thể cuộn theo chiều ngang và chiều dọc bằng các phím con trỏ.

Để lại quan điểm này bằng cách nhấn qphím, sẽ thoát khỏi lesscông cụ.


23
đây là thiên tài mẹo tuyệt vời. Kể từ buổi bình minh của thời gian tôi đã muốn điều này.
Richard H

60
có thể được thiết lập lại bằng cách sử dụng nopager.
epeleg

3
Tìm kiếm ít hơn được thực hiện bằng cách nhấn /và sau đó viết chuỗi tìm kiếm, cũng có thể là biểu thức chính quy, sau đó nhấn enter. Tìm kiếm chuyển tiếp bằng cách nhấn nvà lùi bằng cách nhấn N( Shift + n).
Krøllebølle

5
lessthậm chí có thể làm những điều tuyệt vời hơn. Sử dụng &bạn có thể lọc (chỉ hiển thị các dòng khớp) kết quả bằng cách sử dụng các biểu thức thông thường. Điều này hoạt động ngoài việc /tìm kiếm (vẫn sẽ gây ra sự nổi bật). Đặt lại bộ lọc bằng cách nhấn &một lần nữa và sau đó chỉ cần nhấn Return.
Daniel Schneller

3
F sẽ thoát ít hơn ngay lập tức, nếu đầu ra đã vừa với màn hình. X là để ngăn chặn việc cố gắng xóa màn hình khi thoát. Xem trang ít người hơn.
Daniel Schneller

46

Hãy thử bật chế độ dọc, sử dụng \Gđể thực hiện truy vấn thay vì ;:

mysql> SELECT * FROM sometable \G

Kết quả của bạn sẽ được liệt kê ở chế độ dọc, vì vậy mỗi giá trị cột sẽ được in trên một dòng riêng biệt. Đầu ra sẽ hẹp hơn nhưng rõ ràng lâu hơn nhiều.


2
như một sự bổ sung cho \G, bạn cũng có thể sử dụng \gnhư một sự thay thế cho ;, tôi biết, ai sẽ làm điều đó, nhưng nó mang lại bối cảnh cho lý do tại sao \Glàm việc ở nơi đầu tiên.
santiago arizti

25

Sử dụng mysql's egolệnh

Từ mysql's helplệnh:

ego (\ G) Gửi lệnh đến máy chủ mysql, hiển thị kết quả theo chiều dọc.

Vì vậy, bằng cách nối thêm \Gvào select, bạn có thể nhận được đầu ra dọc rất sạch:

mysql> SELECT * FROM sometable \G

Sử dụng máy nhắn tin

Bạn có thể yêu cầu MySQL sử dụng lessmáy nhắn tin với -Stùy chọn của nó để cắt các đường rộng và cung cấp cho bạn một đầu ra mà bạn có thể cuộn bằng các phím mũi tên:

mysql> pager less -S

Do đó, lần tới khi bạn chạy một lệnh có đầu ra rộng, MySQL sẽ cho phép bạn duyệt đầu ra với lessmáy nhắn tin:

mysql> SELECT * FROM sometable;

Nếu bạn đã hoàn tất với máy nhắn tin và muốn quay lại đầu ra thông thường stdout, hãy sử dụng:

mysql> nopager

2
Điều này! Đẹp, cách duy nhất để làm cho điều này hoàn hảo hơn là có một cách để xem các cột kéo dài bao xa. Giống như một thanh cuộn. Tuy nhiên, giải pháp tuyệt vời.
Brandon Lợi ích

24

Bạn có thể sử dụng --tablehoặc -ttùy chọn, sẽ tạo ra một tập hợp kết quả đẹp mắt

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

hoặc một số phương thức khác để chuyển một truy vấn tới mysql, như:

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

đầu ra:

+--------------+--------------+------+-----+---------+----------------+
| 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

Máy nhắn tin mặc định là thiết bị xuất chuẩn. Thiết bị xuất chuẩn có giới hạn cột, do đó đầu ra sẽ được bọc. Bạn có thể đặt các công cụ khác làm máy nhắn tin để định dạng đầu ra. Có hai phương pháp. Một là giới hạn cột, hai là xử lý nó trong vim.

Phương pháp đầu tiên:

  ~  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>

Đầu ra không đầy đủ. Nội dung phù hợp với màn hình của bạn.

Cái thứ hai:

Đặt chế độ vim thành nowrap trong .vimrc của bạn

  ~  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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

Điều này làm việc tốt nhất cho tôi trong một container docker nhẹ. pager cut -c -200. Các câu trả lời được chấp nhận nhiều hơn ở đây yêu cầu tôi tải xuống các phụ thuộc không cần thiết.
Gabriel Gates

7

Chỉ để bổ sung cho câu trả lời mà tôi nghĩ tốt nhất, tôi cũng sử dụng less -SFXnhưng theo một cách khác: tôi thích quảng cáo nó vào .my.cnftệp của mình trong thư mục nhà của tôi, một ví dụ tệp cnf trông như thế này:

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

Điều tốt khi có nó theo cách này, là lesschỉ được sử dụng khi đầu ra của một truy vấn thực sự dài hơn một trang, đây là lời giải thích của tất cả các cờ:

  • -S: Dòng đơn, không bỏ qua dòng khi dòng rộng hơn màn hình, thay vào đó cho phép cuộn sang bên phải.
  • -F: Thoát nếu một màn hình , nếu nội dung không cần cuộn thì chỉ cần gửi đến thiết bị xuất chuẩn.
  • -X: Không có init, vô hiệu hóa bất kỳ đầu ra "ít" nào có thể đã được cấu hình thành đầu ra mỗi khi nó tải.

Lưu ý: trong .my.cnftệp không đặt pagerlệnh bên dưới [client]từ khóa; mặc dù nó có thể hoạt động mysqltốt, mysqldumpsẽ phàn nàn về việc không nhận ra nó.


Lưu ý rằng nếu bạn thực hiện truy vấn "không giới hạn" trên một bảng lớn, bạn sẽ không nhận thấy sự hỗn loạn do nó gây ra bởi vì nó lesssẽ được neo vào dòng đầu tiên của đầu ra.
santiago arizti

2

Nếu bạn đang sử dụng MySQL tương tác, bạn có thể đặt máy nhắn tin của mình để sử dụng sednhư thế này:

$ 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"

Nếu bạn không sử dụng sedlàm máy nhắn tin, đầu ra sẽ như thế này:

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

1

Tôi đã viết pspg- https://github.com/okbob/pspg

Máy nhắn tin này được thiết kế cho dữ liệu dạng bảng - và MySQL cũng được hỗ trợ.

MariaDB [sakila]> pager pspg -s 14 -X - Force-uniborder --quito-if-one-screen
PAGER được đặt thành 'pspg -s 14 -X - Force-uniborder --quito-if-one-screen'
MariaDB [sakila]> chọn ngay ();
MariaDB [sakila]> select * từ nicer_but_slower_film_list giới hạn 100;

0

Tôi tin rằng putty có số lượng cột tối đa bạn có thể chỉ định cho cửa sổ.

Đối với Windows, cá nhân tôi sử dụng Windows PowerShell và đặt chiều rộng bộ đệm màn hình cao một cách hợp lý. Độ rộng cột vẫn cố định và bạn có thể sử dụng thanh cuộn ngang để xem dữ liệu. Tôi đã có cùng một vấn đề bạn đang gặp phải bây giờ.

chỉnh sửa: Đối với các máy chủ từ xa mà bạn phải SSH vào, bạn sẽ sử dụng một cái gì đó như plink + Windows PowerShell


0

Bạn có thể sử dụng teeđể ghi kết quả truy vấn của mình vào một tệp:

tee somepath\filename.txt

-1

Sử dụng Windows Command Prompt, bạn có thể tăng kích thước bộ đệm của cửa sổ bao nhiêu bạn muốn xem số lượng cột. Điều này phụ thuộc vào không có cột trong bảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.