¿Cómo mostrar mejor en la Terminal un MySQL SELECT que devuelve demasiados campos?

271

Estoy usando PuTTY para ejecutar:

mysql> SELECT * FROM sometable;

sometabletiene muchos campos y esto da como resultado que muchas columnas intenten mostrarse 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 hay para ver dichos datos en la terminal?

No tengo ni deseo acceso a phpMyAdmin, ni a ninguna otra interfaz GUI. Estoy buscando soluciones de línea de comandos como esta: guardar los resultados de MySQL Query en texto o archivo CVS

Chris Jacob
fuente
La solución es que el desarrollador corrija el error que impide que el terminal se expanda a más ancho que una sola pantalla.
Búho
@Owl, ¿esto es realmente un error? ¿Las soluciones proporcionadas aquí todavía no resuelven el problema?
Gathide

Respuestas:

532

Termine la consulta con \G en lugar de ; . Por ejemplo:

SELECT * FROM sometable\G

Esta consulta muestra las filas verticalmente, así:

*************************** 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
          ...
Rytmis
fuente
9
A pesar de que Windows no distingue entre mayúsculas y minúsculas, Gdebe capitalizarse.
Rafael Barros
3
Solo para aclarar el comentario anterior, cuando escribe SELECT * FROM sometable\Gestá enviando la cadena al cliente de línea de comando mysql, no a Windows, por lo que distingue entre Gmayúsculas y minúsculas
huracán Hamilton el
2
Excepto que no funciona tan bien con grandes cantidades de registros.
Błażej Michalik
1
La documentación vinculada dice: "ego (\ G) Enviar comando al servidor mysql, mostrar el resultado verticalmente. Tenga cuidado al definir un delimitador que pueda aparecer dentro de otras palabras. Por ejemplo, si define el delimitador como X, no podrá use la palabra ÍNDICE en las declaraciones ".
Benjamin
Encontré esto. ¿Podría decirme cómo solucionarlo? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang
347

También puede encontrar esto útil (no solo para Windows):

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

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

Salga de esta vista qpresionando la tecla, que cerrará la lessherramienta.

Daniel Schneller
fuente
23
Esto es genial. Excelente propina. Desde los albores del tiempo he querido esto.
Richard H
6060
se puede restablecer usando nopager.
Epeleg
3
La búsqueda en menos se realiza /presionando y luego escribe la cadena de búsqueda, que también puede ser expresiones regulares, y luego presiona enter. Busque hacia adelante presionando ny hacia atrás presionando N( Shift + n).
Krøllebølle
55
lesspuede hacer cosas aún más geniales. Usando &puede filtrar (solo mostrar líneas coincidentes) el resultado usando expresiones regulares. Esto funciona además de la /búsqueda (que aún causará el resaltado). Restablezca el filtro &presionando nuevamente y luego simplemente presionando Retorno.
Daniel Schneller
3
F se cerrará menos inmediatamente, si la salida ya se ajusta a la pantalla. X es para evitar que menos intente borrar la pantalla al salir. Vea la página de menos man.
Daniel Schneller
46

Intente habilitar el modo vertical, utilizando \Gpara ejecutar la consulta en lugar de ;:

mysql> SELECT * FROM sometable \G

Sus resultados se enumerará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.

Swiety
fuente
2
Como complemento \G, también se puede usar \gcomo un reemplazo para ;, sé, quién haría eso, pero da contexto a por qué \Gfuncionó en primer lugar.
santiago arizti
25

Usando mysqlel egocomando

Desde mysql's helpcomando:

ego (\ G) Envía el comando al servidor mysql, muestra el resultado verticalmente.

Entonces, al agregar un \Ga su select, puede obtener una salida vertical muy limpia:

mysql> SELECT * FROM sometable \G

Usando un buscapersonas

Puede decirle a MySQL que use el lessbuscapersonas con su -Sopción que corta líneas anchas y le da una salida que puede desplazar con las teclas de flecha:

mysql> pager less -S

Por lo tanto, la próxima vez que ejecute un comando con una salida amplia, MySQL le permitirá examinar la salida con el lesslocalizador:

mysql> SELECT * FROM sometable;

Si ha terminado con el buscapersonas y desea volver a la salida normal stdout, use esto:

mysql> nopager
Ronan Boiteau
fuente
2
¡Esta! Hermoso, la única forma de hacer que esto sea más perfecto es tener una forma de ver hasta qué punto las columnas se estiran horizontalmente. Como una barra de desplazamiento. Sin embargo, gran solución.
Brandon Benefield
24

Puede usar la opción --tableo -t, que generará un conjunto de resultados atractivos

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    |                |
+--------------+--------------+------+-----+---------+----------------+
davidmh
fuente
8

El buscapersonas predeterminado es stdout. El stdout tiene la limitación de columna, por lo que la salida se ajustará. Puede configurar otras herramientas como buscapersonas 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 para ahora 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
+-----------+------------+------------+-------------+-------------+----------
~
~
~
hyang0
fuente
Esto funcionó mejor para mí en un contenedor acoplable liviano. pager cut -c -200. Las respuestas más aceptadas aquí me obligaron a descargar dependencias innecesarias.
Gabriel Gates
7

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

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

Lo bueno de tenerlo de esta manera, es que lesssolo se usa cuando el resultado de una consulta es en realidad más de una página, aquí está la explicación de todos los indicadores:

  • -S: línea única, no omita la línea cuando la línea es más ancha que la pantalla, en su lugar, permita que se desplace hacia la derecha.
  • -F: Salir si una pantalla , si el contenido no necesita desplazamiento, simplemente envíelo a stdout.
  • -X: Sin inicio, deshabilita cualquier salida "menos" que se haya configurado para emitir cada vez que se carga.

Nota: en el .my.cnfarchivo no coloque el pagercomando debajo de la [client]palabra clave; aunque podría funcionar mysqlbien, mysqldumpse quejará de no reconocerlo.

santiago arizti
fuente
Tenga en cuenta que si ejecuta una consulta "sin límite" en una tabla grande, no notará el caos causado porque lesspermanecerá anclado a la primera línea de la salida.
santiago arizti
2

Si está utilizando MySQL de forma interactiva, puede configurar su localizador para que se use sedasí:

$ 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 lo usa sedcomo buscapersonas, la salida es así:

"blah":"blah","blah":"blah","blah":"blah"
Paul Ericson
fuente
1

Escribí pspg: https://github.com/okbob/pspg

Este buscapersonas está diseñado para datos tabulares, y MySQL también es compatible.

MariaDB [sakila]> localizador pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER configurado en 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'
MariaDB [sakila]> seleccionar ahora ();
MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100;
Pavel Stehule
fuente
0

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

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

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

Patrick Gryciuk
fuente
0

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

tee somepath\filename.txt
Sathishkumar
fuente
-1

Con 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 no de columnas en la tabla.

Sathishkumar
fuente