如何最好地在终端中显示MySQL SELECT返回太多字段?


271

我正在使用PuTTY运行:

mysql> SELECT * FROM sometable;

sometable有很多字段,这导致试图在终端中显示很多列。这些字段环绕到下一行,因此很难将字段名称与字段标题对齐。

在终端中查看此类数据有哪些解决方案?

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


解决方案是为开发人员修复导致终端扩展到比单个屏幕更宽的错误。
猫头鹰

@Owl,这真的是一个错误吗?此处提供的解决方案是否尚未解决问题?
盖德

Answers:


531

\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区分大小写的原因
Hurricane Hamilton

2
除非它不适用于大量记录。
Błażej米哈利克

1
链接的文档说:“ ego(\ G)发送命令到mysql服务器,垂直显示结果。要小心定义可能在其他字词中出现的定界符。例如,如果将定界符定义为X,则将无法在语句中使用“ INDEX”一词。”
本杰明

我遇到了这个 你能告诉我如何解决吗?sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang'5

347

您可能还会发现此功能有用(仅非Windows):

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

这将通过less命令行工具使用管道输出-使用这些参数-将为您提供表格输出,可使用光标键在水平和垂直方向上滚动。

q按下键退出此视图,这将退出该less工具。


23
这是天才。优秀的技巧。自从天亮以来,我一直想要这个。
理查德H

60
可以使用nopager重置。
epeleg 2011年

3
通过点击/然后写入搜索字符串(也可以是正则表达式)来完成搜索,然后按Enter。按向前搜索n,按NShift + n)向后搜索。
Krøllebølle

5
less可以做更多更酷的事情。使用&可以进一步使用正则表达式过滤(仅显示匹配的行)结果。除了/搜索(此操作仍会导致突出显示)之外,此功能也起作用。通过&再次点击然后按回车键来重置过滤器。
Daniel Schneller

3
如果输出已经适合屏幕,则F不会立即退出。X是为了防止少点尝试在退出时清除屏幕。请参见较少的手册页。
Daniel Schneller

46

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

mysql> SELECT * FROM sometable \G

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


2
作为的补充\G,您也可以\g代替;,我知道,谁会这样做,但是它为\G最初工作的原因提供了背景信息。
圣地亚哥·亚利桑那州

25

使用mysqlego命令

mysqlhelp命令:

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

因此,通过将附加\Gselect,可以得到非常干净的垂直输出:

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。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模式以在.vimrc中设置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。这里接受更多的答案需要我下载不必要的依赖项。
加百利·盖茨

7

只是为了补充我认为最好的答案,我还使用less -SFX了另一种方式:我喜欢将其添加到.my.cnf主文件夹中的文件中,示例cnf文件如下所示:

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

用这种方式的好处是,less仅当查询的输出实际上超过一页时才使用,这里是所有标志的解释:

  • -S:单行,当行比屏幕宽时不要跳过行,而是允许向右滚动。
  • -F:退出一个屏幕,如果内容不需要滚动,则发送到标准输出。
  • -X:无init,禁用每次配置为输出的“ 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

我写了-https pspg: //github.com/okbob/pspg

此分页器专为表格数据而设计-并且还支持MySQL。

MariaDB [sakila]>传呼机pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER设置为'pspg -s 14 -X --force-uniborder --quit-if-one-screen'
MariaDB [sakila]>选择now();
MariaDB [sakila]>从nicer_but_slower_film_list限制100中选择*;

0

我相信腻子具有可以为窗口指定的最大列数。

对于Windows,我个人使用Windows PowerShell,并将屏幕缓冲区宽度设置得较高。列宽保持固定,您可以使用水平滚动条查看数据。您遇到了同样的问题。

编辑:对于必须通过SSH进入的远程主机,将使用plink + Windows PowerShell之类的东西


0

您可以用来tee将查询结果写入文件:

tee somepath\filename.txt

-1

使用Windows命令提示符,可以增加窗口的缓冲区大小,以使您可以看到列数。这取决于表中的列数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.