Как лучше всего отобразить в терминале MySQL SELECT, возвращающий слишком много полей?


271

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

mysql> SELECT * FROM sometable;

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

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

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


Решением для разработчика является исправление ошибки, которая останавливает расширение терминала до ширины, превышающей один экран.
Сова

@ Ой, это действительно ошибка? Решения, представленные здесь, еще не решили проблему?
Гатиде

Ответы:


532

Завершить запрос с \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
          ...

9
Несмотря на то, что Windows не учитывает регистр, это Gдолжно быть написано заглавными буквами.
Рафаэль Баррос

3
Просто для пояснения вышеупомянутого комментария, когда вы набираете текст, SELECT * FROM sometable\Gвы отправляете строку клиенту командной строки mysql, а не Windows, именно поэтому Gон чувствителен к регистру
ураган Гамильтон

2
За исключением того, что это не работает так хорошо с большим количеством записей.
Błażej Michalik

1
В связанной документации написано: «ego (\ G) Отправьте команду на сервер MySQL, отобразите результат вертикально. Будьте внимательны при определении разделителя, который может встречаться в других словах. Например, если вы определите разделитель как X, вы не сможете используйте слово INDEX в заявлениях. "
Бенджамин

Я столкнулся с этим. Подскажите, пожалуйста, как это исправить? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang

347

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

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

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

Оставьте этот вид, нажав qклавишу, которая закроет lessинструмент.


23
это гений отличный совет. С незапамятных времен я хотел этого.
Ричард Х

60
можно сбросить с помощью nopager.
Epeleg

3
Поиск в less выполняется нажатием, /а затем вводом строки поиска, которая также может быть регулярными выражениями, и затем нажмите ввод. Поиск вперед, нажав nи назад, нажав N( Shift + n).
Krøllebølle

5
lessможет сделать еще больше классных вещей. Используя его, &вы можете фильтровать (показывать только совпадающие строки) результат, используя регулярные выражения. Это работает в дополнение к /поиску (который все равно вызовет выделение). Сбросьте фильтр, &снова нажав, а затем просто нажав Return.
Даниэль Шнеллер

3
F немедленно прекратит работу, если вывод уже умещается на экране. X должен помешать меньше попытаться очистить экран при выходе. Смотрите меньше справочной страницы.
Даниэль Шнеллер

46

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

mysql> SELECT * FROM sometable \G

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


2
в качестве дополнения \G, вы также можете использовать \gв качестве замены ;, я знаю, кто будет это делать, но это дает контекст для того, почему \Gработал в первую очередь.
Сантьяго Аристи

25

Использование mysql«S egoкоманды

Из mysql«S 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

2
Это! Красивый, единственный способ сделать это более совершенным - это увидеть, как далеко колонны растягиваются по горизонтали. Как полоса прокрутки. Тем не менее, отличное решение.
Брэндон Бенефилд,

24

Вы можете использовать опцию --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    |                |
+--------------+--------------+------+-----+---------+----------------+

8

Пейджером по умолчанию является стандартный вывод. 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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

Это лучше всего сработало для меня в легком док-контейнере. pager cut -c -200, Более принятые ответы требовали от меня загрузки ненужных зависимостей.
Габриэль Гейтс

7

Просто чтобы дополнить ответ, который я считал лучшим, я тоже использую, 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будет жаловаться на то, что не признает это.


Обратите внимание, что если вы выполните запрос «без ограничений» для большой таблицы, вы не заметите вызванный этим хаос, потому что lessон останется привязанным к первой строке вывода.
Сантьяго Аристи

2

Если вы используете 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

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

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

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER установлен в 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'
MariaDB [sakila]> выберите сейчас ();
MariaDB [sakila]> выбрать * из ограничения в nicer_but_slower_film_list 100;

0

Я полагаю, что замазка имеет максимальное количество столбцов, которые вы можете указать для окна.

Для Windows я лично использую Windows PowerShell и устанавливаю достаточно большую ширину буфера экрана. Ширина столбца остается фиксированной, и вы можете использовать горизонтальную полосу прокрутки для просмотра данных. У меня была та же проблема, что и у тебя сейчас.

редактировать: для удаленных хостов, которые вы должны использовать SSH, вы должны использовать что-то вроде plink + Windows PowerShell


0

Вы можете использовать, teeчтобы записать результат вашего запроса в файл:

tee somepath\filename.txt

-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.