Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysqli_stmt::bind_param() - spécifiez un autre type de données que s pour chaque paramètre

La seule fois où j'ai trouvé qu'il est important d'utiliser un paramètre entier est dans un LIMIT clause.

SELECT
...
LIMIT ?, ?

MySQL n'accepte pas les littéraux de chaîne entre guillemets dans ce contexte et n'accepte pas les paramètres de type chaîne. Vous devez utiliser un entier.

Voir Requête PDO paramétrée et Clause `LIMIT` - ne fonctionne pas pour mes tests à ce sujet. C'était une question sur PDO, et je n'ai pas testé mysqli, mais je pense que c'est une exigence MySQL côté serveur d'utiliser des paramètres entiers dans ce cas. Cela devrait donc s'appliquer également à mysqli.

Dans tous les autres cas (autant que je sache), MySQL est capable de convertir des chaînes en nombres entiers en lisant les premiers chiffres de la chaîne et en ignorant les caractères suivants.

@Dharman dans un commentaire ci-dessous fait référence à la prise en charge par MySQL des entiers dans ORDER BY :

SELECT
...
ORDER BY ?

Un entier dans ORDER BY signifie trier par la colonne à cette position, et non par la valeur constante du nombre :

SELECT
...
ORDER BY 1 -- sorts by the 1st column

Mais une valeur de chaîne équivalente contenant ce nombre n'agit pas de la même manière. Il trie par la valeur constante de la chaîne, ce qui signifie que chaque ligne est liée et que l'ordre de tri sera arbitraire.

SELECT
...
ORDER BY '1' -- sorts by a constant value, so all rows are tied

Il s'agit donc d'un autre cas où le type de données d'un paramètre de requête est important.

D'autre part, en utilisant des nombres ordinaux pour trier par la colonne à cette position dans ORDER BY ou GROUP BY est obsolète et nous ne devrions pas nous fier à cette utilisation de SQL.