如何最好地显示在终端一个MySQL选择返回太多的字段?

我使用腻子运行:

mysql> SELECT * FROM sometable;

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

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

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

277666 次浏览

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

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

mysql> SELECT * FROM sometable \G

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

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

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

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

你可能也会发现这很有用(非windows):

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

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

通过点击q键离开这个视图,这将退出less工具。

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

你可以使用tee将查询结果写入一个文件:

tee somepath\filename.txt

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

如果你是交互使用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"

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

为了补充我认为最好的答案,我也使用了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会抱怨无法识别它。

使用mysqlego命令

mysqlhelp命令:

自我(\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

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

这个寻呼机是为表格数据设计的- MySQL也被支持。

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER set to '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;