我正在使用PuTTY运行:

mysql> SELECT * FROM sometable;

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

在终端中查看这些数据有什么解决方案?

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


当前回答

默认的分页器是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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

其他回答

默认的分页器是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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

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

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

编辑:对于远程主机,你必须SSH进入,你会使用一些像plink + Windows PowerShell

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

mysql> SELECT * FROM sometable \G

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

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

只是为了补充我认为最好的答案,我也用了更少的-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将抱怨不能识别它。