¿Cómo mostrar mejor en Terminal a MySQL SELECT devolviendo demasiados campos?


Estoy usando PuTTY para ejecutar:

mysql> SELECT * FROM sometable;

sometable tiene muchos campos y esto resulta en muchas columnas tratando de ser mostradas en el terminal. Los campos se ajustan a la siguiente línea, por lo que es muy difícil alinear los títulos de las columnas con los valores de los campos.

¿Qué soluciones existen para ver dichos datos en terminal?

No tengo ni quiero acceso a phpMyAdmin ni a ninguna otra interfaz GUI. Estoy buscando soluciones de línea de comandos como esta: Save MySQL Resultados de la consulta en un archivo de texto o CVS

Author: Ronan Boiteau, 2009-05-29

11 answers

SELECT * FROM sometable\G

Esta consulta muestra las filas verticalmente, así:

*************************** 1. row ***************************
             id: 1
 342
Author: Rytmis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-17 14:59:28

Esto también puede ser útil (no solo para Windows):

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

Esto canalizará la salida a través de la herramienta de línea de comandos less que - con estos parámetros - le dará una salida tabular que se puede desplazar horizontal y verticalmente con las teclas del cursor.

Deje esta vista pulsando la tecla q, que saldrá de la herramienta less.

 275
Author: Daniel Schneller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-21 08:54:33

Intente habilitar el modo vertical, usando \G para ejecutar la consulta en lugar de ;:

mysql> SELECT * FROM sometable \G

Sus resultados se mostrarán en el modo vertical, por lo que cada valor de columna se imprimirá en una línea separada. La salida será más estrecha, pero obviamente mucho más larga.

 31
Author: Swiety,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-04 19:57:15

Puede usar la opción --table o -t, que generará un conjunto de resultados de aspecto agradable

echo 'desc table_name' | mysql -uroot database -t

O algún otro método para pasar una consulta a mysql, como:

mysql -uroot table_name --table < /tmp/somequery.sql

Salida:

+--------------+--------------+------+-----+---------+----------------+
| 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    |                |
+--------------+--------------+------+-----+---------+----------------+
 21
Author: davidmh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-04 18:00:13

Usando mysql ' s ego comando

De mysql's help comando:

Ego (\G) Enviar comando al servidor mysql, mostrar el resultado verticalmente.

Así que añadiendo un \G a su select, puede obtener una salida vertical muy limpia:

mysql> SELECT * FROM sometable \G;

Usando un buscapersonas

Puede decirle a MySQL que use el buscapersonas less con su opción -S que corta líneas anchas y le da una salida que puede desplazarse con la flecha claves:

mysql> pager less -S

Por lo tanto, la próxima vez que ejecute un comando con una salida amplia, MySQL le permitirá navegar por la salida con el buscapersonas less:

mysql> SELECT * FROM sometable;

Si has terminado con el buscapersonas y quieres volver a la salida normal en stdout, usa esto:

mysql> nopager
 9
Author: Ronan Boiteau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-16 18:39:01

El buscapersonas predeterminado es stdout. La salida estándar tiene la limitación de columna, por lo que la salida se empaquetaría. Puede configurar otras herramientas como paginador para formatear la salida. Hay dos métodos. Una es limitar la columna, la otra es procesarla en vim.

El primer método:

➜  ~  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>

La salida no está completa. El contenido se ajusta a su pantalla.

El segundo:

Establezca el modo vim en nowrap en su .vimrc

➜  ~  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
+-----------+------------+------------+-------------+-------------+----------
~
~
~
 6
Author: hyang0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-25 08:42:03

Solo para complementar la respuesta que pensé mejor, también uso less -SFX pero de una manera diferente: Me gusta agregarlo a mi archivo .my.cnf en mi carpeta de inicio, un ejemplo de archivo cnf se ve así:

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

Lo bueno de tenerlo de esta manera, es que less solo se usa cuando la salida de una consulta es realmente de más de una página, aquí está la explicación de todas las banderas:

  • - S: Línea simple, no omita la línea cuando la línea es más ancha que la pantalla, en lugar de permitir que se desplace a la derecho.
  • -F: Quit if one screen, if content doesn't need scrolling then just send to stdout.
  • -X: No init, desactiva cualquier salida que "less" haya configurado para salir cada vez que se carga.

Nota: en el archivo .my.cnf no ponga el comando pager debajo de la palabra clave [client]; aunque podría funcionar con mysql bien, mysqldump se quejará de no reconocerlo.

 2
Author: santiago arizti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 15:25:26

Si está utilizando MySQL de forma interactiva, puede configurar su buscapersonas para usar sed de la siguiente manera:

$ 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"

Si no usas sed como buscapersonas, la salida es así:

"blah":"blah","blah":"blah","blah":"blah"
 1
Author: Paul Ericson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-21 16:16:21

Creo que putty tiene un número máximo de columnas que puede especificar para la ventana.

Para Windows yo personalmente uso Windows PowerShell y establezco el ancho del búfer de pantalla razonablemente alto. El ancho de la columna permanece fijo y puede usar una barra de desplazamiento horizontal para ver los datos. Tuve el mismo problema que tú ahora.

Editar: Para los hosts remotos en los que tiene que usar SSH, usaría algo como plink + Windows PowerShell

 0
Author: Patrick Gryciuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-29 07:27:55

Puede usar tee para escribir el resultado de su consulta en un archivo:

tee somepath\filename.txt
 0
Author: Sathishkumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-17 14:47:03

Usando el Símbolo del sistema de Windows puede aumentar el tamaño del búfer de la ventana tanto como desee ver el número de columnas. Esto depende del número de columnas de la tabla.

 0
Author: Sathishkumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 13:51:43