sql >> Database >  >> RDS >> Mysql

mysqli_stmt::bind_param() - specificeer een ander gegevenstype dan s voor elke parameter

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.



  1. Vind de hostnaam en poort met behulp van PSQL-commando's

  2. Hoe fouten in de onjuiste tekenreekswaarde op te lossen?

  3. Topfouten die moeten worden vermeden bij MySQL-replicatie

  4. Alles wat u moet weten over SQL Server JOINS