ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 PuTTY 运行:

mysql> SELECT * FROM sometable;

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

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

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

解决方案是让开发人员修复阻止终端扩展到比单个屏幕更宽的错误。
@Owl,这真的是一个错误吗?这里提供的解决方案还没有解决问题吗?

C
CODE-REaD

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

尽管 Windows 不区分大小写,但此 G 必须大写。
只是为了澄清上述注释,当您键入 SELECT * FROM sometable\G 时,您将字符串发送到 mysql 命令行客户端,而不是 Windows,这就是 G 区分大小写的原因
除非它不适用于大量记录。
链接的文档说:“ego (\G) 向mysql服务器发送命令,垂直显示结果。小心定义可能出现在其他单词中的分隔符。例如,如果将分隔符定义为X,您将无法在语句中使用 INDEX 这个词。”
我遇到了这个。你能告诉我如何解决吗? sh: 1: less: not found 44 rows in set (0.01 sec)
D
Daniel Schneller

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

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

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

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


这是天才。很好的提示。从一开始我就想要这个。
可以使用 nopager 重置。
通过点击 / 进行搜索,然后写入搜索字符串,也可以是正则表达式,然后按 Enter。按 n 向前搜索,按 N 向后搜索 (Shift + n)。
less 可以做更酷的事情。使用 &,您可以使用正则表达式进一步过滤(仅显示匹配的行)结果。除了 / 搜索(仍会导致突出显示)之外,这还有效。再次点击 & 重置过滤器,然后按 Return。
如果输出已经适合屏幕,F 将不立即退出。 X 是为了防止 less 在退出时尝试清除屏幕。请参阅较少的手册页。
M
Michael

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

mysql> SELECT * FROM sometable \G

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


作为对 \G 的补充,您还可以使用 \g 作为 ; 的替代品,我知道,谁会这样做,但它首先说明了为什么 \G 有效。
R
Ronan Boiteau

使用 mysql 的 ego 命令

mysqlhelp 命令:

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

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

mysql> SELECT * FROM sometable \G

使用寻呼机

您可以告诉 MySQL 使用带有 -S 选项的 less 寻呼机,该选项可以切断宽行并为您提供可以使用箭头键滚动的输出:

mysql> pager less -S

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

mysql> SELECT * FROM sometable;

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

mysql> nopager

这个!美丽,使这更完美的唯一方法是有一种方法可以查看列水平延伸的距离。就像一个滚动条。不过,很好的解决方案。
M
Michael

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

s
santiago arizti

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

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

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

-S:单行,当行宽于屏幕时不要跳过行,而是允许向右滚动。

-F:如果只有一屏则退出,如果内容不需要滚动则只发送到标准输出。

-X:无初始化,禁用任何输出“较少”可能已配置为每次加载时输出。

注意:在 .my.cnf 文件中,不要将 pager 命令放在 [client] 关键字下方;尽管它可以很好地与 mysql 配合使用,但 mysqldump 会抱怨无法识别它。


请注意,如果您对大型表执行“无限制”查询,您将不会注意到它引起的混乱,因为 less 将保持锚定在输出的第一行。
h
hyang0

默认寻呼机是标准输出。标准输出具有列限制,因此输出将被包装。您可以将其他工具设置为寻呼机来格式化输出。有两种方法。一是限制列,二是在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。这里更被接受的答案要求我下载不必要的依赖项。
R
Ronan Boiteau

如果您以交互方式使用 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"

P
Pavel Stehule

我写了 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;

P
Patrick Gryciuk

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

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

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


R
Ronan Boiteau

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

tee somepath\filename.txt

R
Ronan Boiteau

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