324

我正在使用PuTTY运行:

mysql> SELECT * FROM sometable;

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

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

我没有也不想访问 phpMyAdmin - 或任何其他 GUI 界面。我正在寻找这样的命令行解决方案:Save MySQL Query results into text or CVS file

4

12 回答 12

684

\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
          ...
于 2009-05-29T07:16:15.777 回答
390

您可能还会发现这很有用(仅限非 Windows):

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

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

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

于 2011-06-21T08:54:33.473 回答
50

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

mysql> SELECT * FROM sometable \G

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

于 2009-05-29T07:16:31.313 回答
43

使用mysql'sego命令

mysqlhelp命令:

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

因此,通过将 a 附加\G到您的select,您可以获得非常干净的垂直输出:

mysql> SELECT * FROM sometable \G

使用寻呼机

您可以告诉 MySQL 使用less分页器及其-S选项,该选项可以截断宽行并为您提供可以使用箭头键滚动的输出:

mysql> pager less -S

因此,下次您运行具有宽输出的命令时,MySQL 将允许您使用less分页器浏览输出:

mysql> SELECT * FROM sometable;

如果您已完成寻呼机并想返回到 上的常规输出stdout,请使用以下命令:

mysql> nopager
于 2018-01-16T18:39:01.997 回答
32

您可以使用--tableor-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    |                |
+--------------+--------------+------+-----+---------+----------------+
于 2012-05-09T19:26:18.667 回答
12

为了补充我认为最好的答案,我也使用less -SFX了不同的方式:我喜欢将它添加到我.my.cnf的主文件夹中的文件中,示例 cnf 文件如下所示:

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

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

  • -S:单行,当行宽于屏幕时不要跳过行,而是允许向右滚动。
  • -F:如果只有一屏则退出,如果内容不需要滚动则只发送到标准输出。
  • -X:无初始化,禁用任何输出“较少”可能已配置为每次加载时输出。

注意:在.my.cnf文件中不要把pager命令放在[client]关键字下面;虽然它可能mysql很好用,但mysqldump会抱怨不承认它。

于 2017-09-12T15:25:26.600 回答
8

默认寻呼机是标准输出。标准输出具有列限制,因此输出将被包装。您可以将其他工具设置为寻呼机来格式化输出。有两种方法。一是限制列,二是在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
+-----------+------------+------------+-------------+-------------+----------
~
~
~
于 2015-06-25T08:42:03.630 回答
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"
于 2014-01-03T17:37:47.553 回答
1

我写了pspg- https://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]> 现在选择();
MariaDB [sakila]> select * from nicer_but_slower_film_list 限制 100;
于 2018-12-20T03:27:14.480 回答
0

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

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

编辑:对于您必须通过 SSH 连接的远程主机,您可以使用 plink + Windows PowerShell 之类的东西

于 2009-05-29T07:20:59.917 回答
0

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

tee somepath\filename.txt
于 2013-01-04T04:12:34.720 回答
-2

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

于 2013-01-04T05:21:31.900 回答