A única vez que descobri que é importante usar um parâmetro inteiro é em um
LIMIT
cláusula. SELECT
...
LIMIT ?, ?
O MySQL não aceita literais de string entre aspas neste contexto e não aceita parâmetros com tipo de string. Você tem que usar um número inteiro.
Consulte consulta PDO parametrizada e Cláusula `LIMIT` - não está funcionando para meus testes sobre isso. Essa foi uma pergunta sobre o PDO, e eu não testei o mysqli, mas acredito que seja um requisito do MySQL do lado do servidor usar parâmetros inteiros neste caso. Portanto, deve se aplicar ao mysqli também.
Em todos os outros casos (AFAIK), o MySQL é capaz de converter strings em inteiros lendo os primeiros dígitos da string e ignorando quaisquer caracteres seguintes.
@Dharman em um comentário abaixo faz referência ao suporte do MySQL para inteiros em
ORDER BY
:SELECT
...
ORDER BY ?
Um inteiro em
ORDER BY
significa classificar pela coluna nessa posição, não pelo valor constante do número:SELECT
...
ORDER BY 1 -- sorts by the 1st column
Mas um valor de string equivalente contendo esse número não age da mesma forma. Ele classifica pelo valor constante da string, o que significa que cada linha está vinculada e a ordem de classificação será arbitrária.
SELECT
...
ORDER BY '1' -- sorts by a constant value, so all rows are tied
Portanto, este é outro caso em que o tipo de dados para um parâmetro de consulta é importante.
Por outro lado, usando números ordinais para classificar pela coluna nessa posição em
ORDER BY
ou GROUP BY
está obsoleto e não devemos confiar nesse uso de SQL.