如何在终端中最佳显示返回过多字段的MySQL SELECT?

366
我正在使用 PuTTY 运行:
mysql> SELECT * FROM sometable;

sometable有许多字段,因此在终端中尝试显示许多列。字段换行到下一行,所以很难将列标题与字段值对齐。

有哪些解决方案可用于在终端中查看这样的数据?

我没有也不想使用phpMyAdmin或任何其他GUI界面。我正在寻找像这样的命令行解决方案: 将MySQL查询结果保存为文本或CVS文件


解决方案是开发人员修复导致终端无法扩展到单个屏幕以上的错误。 - Owl
@Owl,这真的是一个bug吗?这里提供的解决方案还没有解决问题吗? - Gathide
12个回答

761

使用\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
          ...

13
虽然Windows不区分大小写,但这个 G 必须大写。 - Rafael Barros
5
仅为澄清上面的评论,当您键入 SELECT * FROM sometable\G 时,您是将该字符串发送到 MySQL 命令行客户端,而不是 Windows,这就是为什么 G 是区分大小写的原因。 - Hurricane Hamilton
3
但是对于大量记录,它的效果并不理想。 - Błażej Michalik
1
链接的文档中写道: "ego (\G) 发送命令到mysql服务器,垂直显示结果。要小心定义可能出现在其他单词中的分隔符。例如,如果您将分隔符定义为X,则无法在语句中使用单词INDEX。" - Benjamin
1
@AkashVerma 对于psql,你可以在SQL命令之前使用\x来将输出设置为键值对而不是表格。请参见:https://dev59.com/RF8e5IYBdhLWcg3wJXvm#26040852 - Rytmis
显示剩余4条评论

411
你可能也会发现这个有用(仅限非Windows系统):
mysql> pager less -SFX
mysql> SELECT * FROM sometable;

这将通过命令行工具less将输出导入,使用这些参数,它将提供一个可以使用光标键水平和垂直滚动的表格输出。
按下q键退出less工具,离开此视图。

29
太聪明了!绝佳的技巧。自从人类存在以来,我就一直想要这个。 - Richard H
72
可以使用nopager进行重置。 - epeleg
5
在 less 中搜索的方法是先按下 /,然后输入要搜索的字符串(也可以是正则表达式),再按回车键。按下 n 可以向前搜索,按下 NShift + n)可以向后搜索。 - Krøllebølle
7
less 可以做更多很酷的事情。使用 &,您可以使用正则表达式进一步过滤结果(只显示匹配的行)。这是在 / 搜索之外的附加功能(它仍会导致高亮显示)。通过再次按下 & 然后回车来重置过滤器。 - Daniel Schneller
5
如果输出已经适合屏幕,F 将不会立即退出。X 用于防止 less 在退出时尝试清除屏幕。请参见 less 的手册页。 - Daniel Schneller
显示剩余9条评论

59

使用mysqlego命令

来自mysqlhelp命令:

ego (\G) 发送命令到mysql服务器,垂直显示结果。

因此,在你的select语句后添加\G,就可以得到非常干净的垂直输出:

mysql> SELECT * FROM sometable \G

使用分页器

你可以告诉MySQL使用-S选项的less分页器,它会裁剪宽行并提供一个可通过箭头键滚动的输出:

mysql> pager less -S

因此,下次您运行具有广泛输出的命令时,MySQL将让您使用less分页程序浏览输出:

mysql> SELECT * FROM sometable;

如果你已经使用分页功能并想要返回到 stdout 上的常规输出,请使用以下命令:

如果你已经用过“分页”功能,现在想停止这个功能,回到“标准”输出,请使用下面的命令:
mysql> nopager

3
这个!很漂亮,唯一让它更完美的方法是有一种方式来查看列水平延伸的距离,就像滚动条一样。尽管如此,这是个很好的解决方案。 - Brandon Benefield

52

尝试启用垂直模式,使用\G而不是;来执行查询:

mysql> SELECT * FROM sometable \G

你的结果将以垂直模式列出,因此每个列值将印在单独的行上。输出将更窄但显然更长。


3
作为对\G的补充,你也可以使用\g来替换;。我知道,谁会这么做呢,但这解释了为什么\G能够起作用。 - santiago arizti

39
你可以使用--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    |                |
+--------------+--------------+------+-----+---------+----------------+

12

为了补充我认为最好的答案,我也使用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将停留在输出的第一行。 - santiago arizti

11
默认的翻页工具是标准输出(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>

输出不完整。内容适合您的屏幕。

第二个:

在您的.vimrc中将vim模式设置为nowrap。

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

这对我来说在一个轻量级的Docker容器中效果最好。pager cut -c -200。这里更被接受的答案要求我下载不必要的依赖项。 - Gabe Gates

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]> select now();
MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100;

0
你可以使用tee命令将查询结果写入文件中。
tee somepath\filename.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接