Как лучше всего отобразить в терминале MySQL SELECT, возвращая слишком много полей? - PullRequest
230 голосов
/ 29 мая 2009

Я использую PuTTY для запуска:

mysql> SELECT * FROM sometable;

sometable имеет много полей, и это приводит к тому, что многие столбцы пытаются отобразиться в терминале. Поля переносятся на следующую строку, поэтому очень трудно выровнять заголовки столбцов со значениями полей.

Какие существуют решения для просмотра таких данных в терминале?

У меня нет ни доступа к phpMyAdmin, ни к любым другим интерфейсам графического интерфейса. Я ищу решения для командной строки, такие как это: Сохранение результатов MySQL Query в текстовый файл или файл CVS

Ответы [ 12 ]

427 голосов
/ 29 мая 2009

Завершите запрос с помощью \G вместо ;. Например:

SELECT * FROM sometable\G

Этот запрос отображает строки по вертикали, например:

*************************** 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
          ...
311 голосов
/ 21 июня 2011

Вы также можете найти это полезным (не только для Windows):

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

Это будет направлять выход через инструмент командной строки less, который - с этими параметрами - даст вам табличный вывод, который можно прокручивать горизонтально и вертикально с помощью клавиш курсора.

Выйдите из этого представления, нажав клавишу q, которая закроет инструмент less.

42 голосов
/ 29 мая 2009

Попробуйте включить вертикальный режим, используя \G для выполнения запроса вместо ;:

mysql> SELECT * FROM sometable \G

Ваши результаты будут перечислены в вертикальном режиме, поэтому каждое значение столбца будет напечатано в отдельной строке. Выходной сигнал будет уже, но, очевидно, намного длиннее.

22 голосов
/ 09 мая 2012

Вы можете использовать опцию --table или -t, которая выдаст красивый набор результатов

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

или другой метод для передачи запроса в mysql, например:

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

выход:

+--------------+--------------+------+-----+---------+----------------+
| 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    |                |
+--------------+--------------+------+-----+---------+----------------+
18 голосов
/ 16 января 2018

Используя команду mysql ego

Из команды mysql help:

ego (\ G) Отправить команду на сервер MySQL, отобразить результат по вертикали.

Таким образом, добавив \G к вашему select, вы можете получить очень чистый вертикальный вывод:

mysql> SELECT * FROM sometable \G;

Использование пейджера

Вы можете указать MySQL использовать пейджер less с его опцией -S, которая обрезает широкие строки и выдает вывод, который можно прокручивать с помощью клавиш со стрелками:

mysql> pager less -S

Таким образом, при следующем запуске команды с широким выводом MySQL позволит вам просмотреть вывод с помощью пейджера less:

mysql> SELECT * FROM sometable;

Если вы закончили с пейджером и хотите вернуться к обычному выводу на stdout, используйте это:

mysql> nopager
7 голосов
/ 25 июня 2015

По умолчанию используется пейджер stdout. Stdout имеет ограничение на столбцы, поэтому вывод будет перенесен. Вы можете установить другие инструменты как пейджер для форматирования вывода. Есть два метода. Один - ограничить столбец, другой - обработать его в vim.

Первый метод:

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

Вывод не завершен. Контент умещается на вашем экране.

Второй:

Установите режим vim для nowrap в вашем .vimrc

➜  ~  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
+-----------+------------+------------+-------------+-------------+----------
~
~
~
5 голосов
/ 12 сентября 2017

Просто чтобы дополнить ответ, который я считал лучшим, я также использую less -SFX, но по-другому: мне нравится добавлять его в мой файл .my.cnf в моей домашней папке, пример файла cnf выглядит так:

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

Хорошая особенность такого подхода состоит в том, что less используется только тогда, когда вывод запроса на самом деле занимает более одной страницы, вот объяснение всех флагов:

  • -S: одна строка, не пропускайте строку, если строка шире экрана, вместо этого позволяйте прокрутить вправо.
  • -F: Выйти, если на одном экране , если контент не нуждается в прокрутке, просто отправить на стандартный вывод.
  • -X: без инициализации, отключается любой вывод, который «less» мог настроить для вывода при каждой загрузке.

Примечание: в файле .my.cnf не ставьте команду pager под ключевым словом [client]; хотя он может работать с mysql, mysqldump будет жаловаться, что не распознал его.

2 голосов
/ 03 января 2014

Если вы используете MySQL в интерактивном режиме, вы можете настроить пейджер на использование sed, например:

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

Если вы не используете sed в качестве пейджера, вывод будет таким:

"blah":"blah","blah":"blah","blah":"blah"
1 голос
/ 20 декабря 2018

Я написал pspg - https://github.com/okbob/pspg

Этот пейджер предназначен для табличных данных - и MySQL также поддерживается.

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER set to 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'
MariaDB [sakila]> select now();
MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100;
0 голосов
/ 04 января 2013

Используя командную строку Windows, вы можете увеличить размер буфера окна, насколько вы хотите видеть количество столбцов. Это зависит от количества столбцов в таблице.

...