sql >> Database teknologi >  >> RDS >> Mysql

Escape-kolonnenavne i PDO-udsagn

ANSI-standardmåden at lave en afgrænset identifikator på er:

SELECT "field1" ...

og hvis der er et " i navnet, så fordoble det:

SELECT "some""thing" ...

Desværre virker dette ikke i MySQL med standardindstillingerne, fordi MySQL foretrækker at tro, at dobbelte anførselstegn er et alternativ til enkelte anførselstegn for strenge bogstaver. I dette tilfælde skal du bruge backticks (som skitseret af Björn) og backslash-escaping.

For at gøre backslash escape korrekt, ville du har brug for mysql_real_escape_string, fordi den er tegnsætafhængig. Men pointen er omstridt, fordi hverken mysql_real_escape_string eller addslashes undslipper bagsideanførselstegn . Hvis du kan være sikker på, at der aldrig vil være ikke-ASCII-tegn i kolonnenavnene, kan du slippe afsted med manuelt at undslippe ` og \-tegnene.

Uanset hvad, er dette ikke kompatibelt med andre databaser. Du kan bede MySQL om at tillade ANSI-syntaksen ved at indstille indstillingen ANSI_QUOTES. På samme måde kvæler SQL Server også i dobbelte anførselstegn som standard; den bruger endnu en syntaks, nemlig firkantede parenteser. Igen kan du konfigurere den til at understøtte ANSI-syntaksen med muligheden 'quoted_identifier'.

Resumé:hvis du kun har brug for MySQL-kompatibilitet:

en. brug backquotes og forbyd backquote, backslash og nul-tegn i navne, fordi det er upålideligt at undslippe dem

Hvis du har brug for kompatibilitet på tværs af DBMS, skal du enten:

b. brug dobbelte anførselstegn og kræver, at MySQL/SQL-Server-brugere ændrer konfigurationen korrekt. Tillad ikke dobbelte anførselstegn i navnet (da Oracle ikke kan håndtere dem selv escaped). Eller,

c. har en indstilling for MySQL vs SQL Server vs Others, og lav enten backquote, firkantet parentes eller dobbeltanførselssyntaks afhængigt af det. Tillad ikke både dobbelte anførselstegn og omvendt skråstreg/backquote/nul.

Dette er noget, du ville håbe, at dataadgangslaget ville have en funktion til, men det har PDO ikke.

Resumé af resuméet:vilkårlige kolonnenavne er et problem, som bedst undgås, hvis du kan hjælpe det.

Resumé af resuméet af resuméet:gnnnnnnnnnnnh.



  1. SQL select where not i underforespørgsel returnerer ingen resultater

  2. Hvordan genererer jeg et tilfældigt tal for hver række i en T-SQL-selektion?

  3. Tilføj år til en dato i PostgreSQL

  4. Eliminerer MySQL almindelige underudtryk mellem SELECT og HAVING/GROUP BY-sætning