J'utilise PuTTY pour exécuter:
mysql> SELECT * FROM sometable;
sometable
comporte de nombreux champs, ce qui a pour conséquence que de nombreuses colonnes tentent de s'afficher dans le terminal. Les champs se superposent à la ligne suivante, il est donc très difficile d'aligner les titres de colonne avec les valeurs de champ.
Quelles sont les solutions pour afficher de telles données dans un terminal?
Je n'ai ni ne veux accéder à phpMyAdmin - ni à aucune autre interface graphique. Je recherche des solutions en ligne de commande telles que celle-ci: enregistrer les résultats de la requête MySQL dans un fichier texte ou CVS
Terminez la requête avec \G
à la place de ;
. Par exemple:
SELECT * FROM sometable\G
Cette requête affiche les lignes verticalement, comme ceci:
*************************** 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
...
Vous pouvez également trouver cela utile (non-Windows uniquement):
mysql> pager less -SFX
mysql> SELECT * FROM sometable;
Cela acheminera la sortie via l'outil de ligne de commande less
qui, avec ces paramètres, vous donnera une sortie tabulaire que vous pourrez faire défiler horizontalement et verticalement à l'aide des touches de direction.
Quittez cette vue en appuyant sur la touche q
, ce qui permet de quitter l'outil less
.
Essayez d'activer le mode vertical en utilisant \G
pour exécuter la requête au lieu de ;
:
mysql> SELECT * FROM sometable \G
Vos résultats seront listés en mode vertical, ainsi chaque valeur de colonne sera imprimée sur une ligne séparée. La sortie sera plus étroite mais évidemment beaucoup plus longue.
Vous pouvez utiliser l'option --table
ou -t
, qui générera un ensemble de résultats d'aspect agréable
echo 'desc table_name' | mysql -uroot database -t
ou une autre méthode pour passer une requête à mysql, comme:
mysql -uroot table_name --table < /tmp/somequery.sql
sortie:
+--------------+--------------+------+-----+---------+----------------+
| 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 | |
+--------------+--------------+------+-----+---------+----------------+
mysql
'ego
De la commande mysql
'help
:
ego (\ G) Envoie la commande au serveur mysql, affiche le résultat verticalement.
Donc, en ajoutant un \G
à votre select
, vous pouvez obtenir une sortie verticale très nette:
mysql> SELECT * FROM sometable \G;
Vous pouvez demander à MySQL d'utiliser le paginateur less
avec son option -S
qui coupe les lignes larges et vous donne une sortie que vous pouvez faire défiler à l'aide des touches fléchées:
mysql> pager less -S
Ainsi, la prochaine fois que vous exécuterez une commande avec une sortie large, MySQL vous permettra de parcourir la sortie avec le pager less
:
mysql> SELECT * FROM sometable;
Si vous en avez terminé avec le pageur et souhaitez revenir à la sortie normale sur stdout
, utilisez ceci:
mysql> nopager
Le pager par défaut est stdout. La sortie standard a la limitation de colonne, ainsi la sortie serait encapsulée. Vous pouvez définir d'autres outils comme pageur pour formater la sortie. Il y a deux méthodes. L'une consiste à limiter la colonne, l'autre à la traiter dans vim.
La première méthode:
➜ ~ 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 sortie n'est pas complète. Le contenu s'adapte à votre écran.
Le deuxième:
Définissez le mode vim pour qu'il soit maintenant dans votre fichier .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
+-----------+------------+------------+-------------+-------------+----------
~
~
~
Juste pour compléter la réponse qui me semblait préférable, j'utilise aussi less -SFX
, mais d'une manière différente: j'aime l'adapter à mon fichier .my.cnf
dans mon dossier de départ, un exemple de fichier cnf ressemblant à ceci:
[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'
L’avantage de l’avoir de cette façon, c’est que less
n’est utilisé que lorsque le résultat d’une requête a en réalité plus d’une page, voici l’explication de tous les drapeaux:
Remarque: dans le fichier .my.cnf
, ne placez pas la commande pager
sous le mot clé [client]
; bien que cela puisse fonctionner avec mysql
eh bien, mysqldump
se plaindra de ne pas le reconnaître.
Si vous utilisez MySQL de manière interactive, vous pouvez configurer votre pageur pour qu'il utilise sed
comme ceci:
$ 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 vous n'utilisez pas sed
comme pageur, le résultat est le suivant:
"blah":"blah","blah":"blah","blah":"blah"
J'ai écrit pspg
- https://github.com/okbob/pspg
Ce pager est conçu pour les données tabulaires - et MySQL est également supporté.
MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-si-un-écran PAGER réglé sur 'pspg -s 14 -X --force- uniborder --quit-si-un-écran ' MariaDB [sakila]> sélectionnez maintenant (); MariaDB [sakila]> sélectionnez * parmi nicer_but_slower_film_list limite 100;
Vous pouvez utiliser tee
pour écrire le résultat de votre requête dans un fichier:
tee somepath\filename.txt
En utilisant l'invite de commande Windows, vous pouvez augmenter la taille de la mémoire tampon de la fenêtre autant que vous le souhaitez pour afficher le nombre de colonnes. Cela dépend du nombre de colonnes dans la table.
Je pense que PuTTY a un nombre maximum de colonnes que vous pouvez spécifier pour la fenêtre.
Pour Windows, j'utilise personnellement Windows PowerShell et j'affine la largeur du tampon d'écran à une valeur raisonnablement élevée. La largeur de la colonne reste fixe et vous pouvez utiliser une barre de défilement horizontale pour voir les données. J'ai eu le même problème que vous avez maintenant.
edit: pour les hôtes distants que vous devez entrer en SSH, vous utiliseriez quelque chose comme plink + Windows PowerShell