Oct/0810
Je hais phpMyAdmin
Je hais phpMyAdmin. Ironiquement, je m’en sers encore beaucoup et pour me contredire davantage, je vais même avouer que c’est “relativement” un bon outil. Mais je le hais quand même.
PhpMyAdmin est l’outil qui m’a fait découvrir MySQL lorsque j’étais encore à l’école. C’est un outil idéal pour débuter en développement Web puisqu’il est intégré à des logiciels comme easyphp ou est souvent ajouté à LAMP (Linux Apache MySQL PHP). L’outil est convivial et permet de faire beaucoup d’opérations, même pour un utilisateur inexpérimenté en SQL. Plusieurs hébergeurs Web l’offrent dans leurs plans puisqu’il est gratuit, simple à installer et facile à maintenir.
Mais quand on connait bien le SQL, plus précisément MySQL, et qu’on s’en sert régulièrement comme je le fais, on en vient à constater ses lacunes. Donc, dans le top 5 des choses que je déteste de phpMyAdmin:
- La création des Foreign Key
Il n’y a rien de plus simple dans phpMyAdmin que de créer une base de données et des tables. Pourtant, appliquer les concepts de clés étrangères est un exercice complexe qu’il n’est pas possible de faire à la création de la table. Une des plus grandes forces de phpMyAdmin est donc intimement liée à une de ses plus grandes faiblesses. Ce manque incite les nouveaux utilisateurs de MySQL à ne pas créer de clés étrangères. - Les int(11)
Je vois régulièrement des int(11) chez les utilisateurs de phpMyAdmin. Contrairement au char et varchar, la “longueur” des types numérique n’est pas une limite imposée. Un int(9) unsigned possède le même nombre maximal qu’un int(11). L’ironie, c’est que la longueur maximale d’un int unsigned, 4294967295, est de 10 chiffres ce qui fait de la valeur par défaut de phpMyAdmin, le int(11), un non-sens. Le seul et unique impact du nombre qu’on peut attribuer à un type numérique est lorsqu’on utilise l’attribut Zerofill. Dans ce cas, le nombre sera “padder” de 0 jusqu’à la longueur désirée. Onze (11) n’est pas une limite non plus. J’ai créé un int(100) unsigned zerofill, inséré la valeur 1, et il y avait bien 99 zéros devant mon 1 lorsque j’ai fait un SELECT. Le comportement par défaut de phpMyAdmin est trompeur. - Les LIMIT 0,30
Pour que le résultat d’une requête s’affiche rapidement, phpMyAdmin n’affiche pas la totalité des enregistrements. Il ajoute automatiquement un “LIMIT 0,30″ à chaque requête. La différence sur le temps d’exécution est remarquable, mais cette technique n’est vraiment pas pratique. - Son dynamisme
Je donne 2 sur 10 au dynamisme. J’ai eu un “vieux” phpMyAdmin designé pour MySQL 4 qui se connectait à un MySQL 5. Beaucoup de nouveaux status (show [global] status) et de nouvelles variables (show [global] variables) n’étaient pas présents dans la page qui sert à les afficher. Pourtant, si on exécute la requête manuellement les valeurs sont bien présentes. Rien de très dynamique là dedans. De plus, j’aimerais avoir accès à un “textbox” en tout temps dans le but de taper des requêtes SQL. Actuellement, je dois cliquer sur la section “SQL” qui pop une fenêtre et le résultat de celle-ci s’affiche dans une nouvelle page. Je déplore aussi le fait que je dois constamment modifier le fameux LIMIT 0,30 pour mettre une autre limit, forçant à ré-exécuter la requête et réafficher le résultat. Ce sont des choses qui pourraient aisément être évitées grâce à AJAX. - Sa facilité à commettre des gaffes
Deux cliques, c’est suffisant pour supprimer des rows, vider une table ou même une base de données entière ! Lorsqu’on tape les statements dans le CLI, nous sommes beaucoup plus alertes et conscients de ce que nous faisons. Nous perdons un peu le sens des responsabilités avec phpMyAdmin car on clique, clique et clique encore et on finit par commettre des choses irréversibles, rapidement. L’interface de gestion des privilèges est chaotique. Je préfère de loin créer les privilèges en tapant directement les statements nécessaires pour être sur de ne pas commettre d’erreur.
En résumé, phpMyAdmin demeure en bon outil malgré tout, mais ces 5 points me font rager plusieurs fois par semaine. Les outils fournir par MySQL possèdent beaucoup de faiblesses (et de bugs!). À défaut d’avoir de meilleurs outils graphiques, j’alterne entre le client en command line (le “CLI”) et phpMyAdmin.
Enjoy this article?
Leave a comment
No trackbacks yet.
2:10 am on October 9th, 2008
Tout à fait d’accord, mais c’est comme un chaussette trouée, c’est affectif, tu la gardes.
6:50 am on October 15th, 2008
Un outil que j’utilise depuis quelques temps et qui est réellement pratique (environnement windows uniquement .. mais fonctionne avec wine ) : SQLyog.
La version entreprise permet de se connecter en ssh évidemment, mais aussi de faire du http tunneling.
Il est bien complet aussi (schema syncro, qui compare la structure de 2 bases et fournit les alters qui vont bien pour passer de l’une à l’autre), etc.
Depuis que je l’utilise, j’ai oublié phpMyAdmin.
10:48 pm on October 15th, 2008
Intéressant. Je viens de lire qu’il est basé ou du moins inspiré par MySQL-Front. J’avais déjà travaillé avec sur un MySQL 3.23 (ca date d’il y a looonnggtemps). Je me fais un devoir de l’essayer! En plus s’il fonctionne avec wine, il n’y a pas de raison de ne pas le faire! Je vous ferai un résumé s’il me plait
7:54 am on October 17th, 2008
Les int(11) peuvent ne pas être unsigned, et dans ce cas, il y a un – devant, donc 11 caractères:
-2147483648
9:03 am on October 17th, 2008
En fait non. Comme je disais, le 11 n’est pas une limite de caractère. En voici la preuve:
mysql> create table testint (a int(10));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into testint values (-2147483648);
Query OK, 1 row affected (0.00 sec)
mysql> select * from testint;
+————-+
| a |
+————-+
| -2147483648 |
+————-+
1 row in set (0.00 sec)
mysql> create table testint2 (a int(5));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into testint2 values (-2147483648);
Query OK, 1 row affected (0.00 sec)
mysql> select * from testint2;
+————-+
| a |
+————-+
| -2147483648 |
+————-+
1 row in set (0.00 sec)
La valeur maximale et minimale demeure la même, peut importe le chiffre qu’on lui attribue à la création. J’ai donné la “longueur” 5 au champ de la table testint2 et j’ai pu y inserer et selectionner une valeur de 10 chiffres (11 caractères si on inclus le signe négatif -)
9:19 pm on October 17th, 2008
La valeur du INT est un nombre de bits de mémoire réservée et non pas un nombre de caractère. C’est avec 4 bits “INT(4)” qu’on peut faire entrer une valeur de -2147483648 à 2147483648.
10:41 am on October 18th, 2008
Il y a une partie de vrai dans ce que tu dis JFP, les INT sont stockés sur 4 bytes sur le disque (et en mémoire, pour les index). Cependant la valeur n’est pas un indice du nombre de bytes utilisés ou réservés. MySQL possède d’autre type numérique qui sont stocké dans un nombre de byte différent, ce qui permet un nombre minimal et maximal différent bien entendu. Le TINYINT (1 byte), le SMALLINT (2 bytes) , le MEDIUMINT (3 bytes), le INT (4 bytes) et finalement le BIGINT (8 bytes).
Il est possible de d’insérer la valeur -2147483648 dans un int(1):
mysql> create table testint3 (a int(1));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into testint3 values (-2147483648);
Query OK, 1 row affected (0.00 sec)
mysql> select * from testint3;
+————-+
| a |
+————-+
| -2147483648 |
+————-+
1 row in set (0.00 sec)
11:28 pm on October 18th, 2008
Une chance que tu es là Pat pour nous donner la bonne réponse.
Je croyais qu’un INT(2) était égal à un SMALLINT.
Je vais aller relire mon livre sur MySQL!
Mais alors a quoi sert de déterminer la valeur d’un INT si ça ne change pas la mémoire réservé ou le nombre de caractère!? Tu es certain que c’est pas MySQL qui change dynamiquement la valeur du INT lorsqu’on entre une valeur plus grosse que la valeur possible dans le type de INT déterminer?
10:27 pm on October 19th, 2008
Je te réponds à l’aide de la doc:
…This optional display width is used to display integer values having a width less than the width specified for the column by left-padding them with spaces.
The display width does not constrain the range of values that can be stored in the column, nor the number of digits that are displayed for values having a width exceeding that specified for the column….
Cependant, les types de données Float et Decimal ont un comportement un peu comme tu le décris. La valeur qu’on peut assigner influence le nombre de bytes requis pour stocker les valeurs.
4:59 am on June 15th, 2009
Bonjour,
J’utilise aussi pas mal phpmyadmin, il n’est pas hyper parfait, mais il a le gros avantage d’être libre !
Et avant de lancer un joli RTFM, dans le config.inc.php de phpmyadmin, tu as quelques paramètres (ligne 250/260 par là…):
$cfg['ShowAll'] = FALSE;
$cfg['MaxRows'] = 30;
$cfg['Order'] = ‘ASC’;
bon amusement !