Posts Tagged ‘mysql’

Comment ajouter un commentaire à une table, ou mieux, à un champ dans ma base de données, depuis mon schema.yml ?

Avec la propriété « description » :

article_id:
{type: TINYINT,
required: true,
default: '0',
description: 'référence à un article',
FK: { type: INTEGER, required: true, foreignTable: article, foreignReference: id }'
}
Publicités

Si les index permettent à la base de données de mieux parcourir les enregistrements, pourquoi ne mettrait-on pas un index sur chaque champ ? Est-ce que cela n’améliorerait pas les recherches ?

En fait, il y a une raison très simple pour ne pas indexer chaque champ :

  • Mettre des index partout fait grossir le fichier d’index, et donc ralentit l’accès aux données. Le bénéfice apporté par l’index est perdu.

De plus, si jamais votre base est normalisée, la redondance des index est déjà prise en compte, et si elle est dénormalisée, vous n’avez pas à créer trop d’index.

Durant une formation, on s’est retrouvé face à une particularité assez fine de MySQL, alors qu’on cherchait à tester PDO en PHP.

Voici la requête préparée qu’on avait mise au point :

SELECT nom, prenom
FROM auteur
WHERE nom = ?;

En lieu et place du nom, nous avons voulu insérer un zéro

Cela donnait donc

SELECT nom, prenom
FROM auteur
WHERE nom = 0;

En ce cas, MySQL transtype tous les noms de champs en entier, de la même manière que PHP, à savoir :
‘abc’ donne 0
‘3 euros’ donne 3

Dans cette requête, le WHERE comporte une égalité, donc MySQL transtype les membres de l’égalité pour la réaliser. Il transtype donc le champ nom en entier, et notre requête devient :

SELECT nom, prenom
FROM auteur
WHERE 0 = 0;

Mais ce qui est encore plus fort, c’est d’utiliser FALSE. Le SQL comprend FALSE comme valeur, mais lors d’une requête, le même transtypage, évoqué ci-dessus, s’opère et FALSE devient 0 en tant qu’entier.

Donc la requête

SELECT nom, prenom
FROM auteur
WHERE nom = FALSE;

renvoie les mêmes résultats que celle déjà citée avec le WHERE 0=0

Etonnant, non ?