De enige keer dat ik heb ontdekt dat het belangrijk is om een integer-parameter te gebruiken, is in een LIMIT
clausule.
SELECT
...
LIMIT ?, ?
MySQL accepteert in deze context geen letterlijke tekenreeksen tussen aanhalingstekens en accepteert geen parameters met een tekenreekstype. Je moet een geheel getal gebruiken.
Zie Geparametriseerde PDO-query en `LIMIT`-clausule - werkt niet voor mijn tests hierover. Dat was een vraag over PDO, en ik heb mysqli niet getest, maar ik geloof dat het in dit geval een server-side MySQL-vereiste is om integer-parameters te gebruiken. Het zou dus ook moeten gelden voor mysqli.
In alle andere gevallen (AFAIK) kan MySQL tekenreeksen omzetten in gehele getallen door de eerste cijfers in de tekenreeks te lezen en de volgende tekens te negeren.
@Dharman verwijst in een opmerking hieronder naar MySQL's ondersteuning voor gehele getallen in ORDER BY
:
SELECT
...
ORDER BY ?
Een geheel getal in ORDER BY
betekent sorteren op de kolom op die positie, niet op de constante waarde van het getal:
SELECT
...
ORDER BY 1 -- sorts by the 1st column
Maar een equivalente tekenreekswaarde die dat nummer bevat, werkt niet hetzelfde. Het sorteert op de constante waarde van de string, wat betekent dat elke rij gebonden is, en de sorteervolgorde zal willekeurig zijn.
SELECT
...
ORDER BY '1' -- sorts by a constant value, so all rows are tied
Daarom is dit een ander geval waarin het gegevenstype voor een queryparameter belangrijk is.
Aan de andere kant, het gebruik van rangtelwoorden om te sorteren op de kolom op die positie in ORDER BY
of GROUP BY
is verouderd en we moeten niet vertrouwen op dat gebruik van SQL.