sql >> Database >  >> RDS >> Mysql

Ontsnappen van kolomnamen in PDO-statements

De ANSI-standaardmanier om een ​​identifier met scheidingstekens uit te voeren is:

SELECT "field1" ...

en als er een " in de naam staat, verdubbel deze dan:

SELECT "some""thing" ...

Helaas werkt dit niet in MySQL met de standaardinstellingen, omdat MySQL er de voorkeur aan geeft dat dubbele aanhalingstekens een alternatief zijn voor enkele aanhalingstekens voor letterlijke tekenreeksen. In dit geval moet je backticks gebruiken (zoals beschreven door Björn) en backslash-escaping.

Om backslash correct te escapen, zou mysql_real_escape_string nodig, omdat het karakterset-afhankelijk is. Maar het punt is betwistbaar, omdat noch mysql_real_escape_string noch addlashes ontsnappen aan het achterste aanhalingsteken . Als u er zeker van kunt zijn dat er nooit niet-ASCII-tekens in de kolomnamen zullen staan, kunt u wegkomen door handmatig een backslash te maken en de tekens ` en \ te ontlopen.

Dit is hoe dan ook niet compatibel met andere databases. U kunt MySQL vertellen om de ANSI-syntaxis toe te staan ​​door de configuratieoptie ANSI_QUOTES in te stellen. Op dezelfde manier verslikt SQL Server zich standaard in dubbele aanhalingstekens; het gebruikt nog een andere syntaxis, namelijk vierkante haken. Nogmaals, je kunt het configureren om de ANSI-syntaxis te ondersteunen met de optie 'quoted_identifier'.

Samenvatting:als je alleen MySQL-compatibiliteit nodig hebt:

a. gebruik aanhalingstekens en verbied de aanhalingstekens, de schuine streep en het nul-teken in namen omdat het onbetrouwbaar is om eraan te ontsnappen

Als u cross-DBMS-compatibiliteit nodig hebt, kunt u ofwel:

b. gebruik dubbele aanhalingstekens en eis dat gebruikers van MySQL/SQL-server de configuratie op de juiste manier wijzigen. Sta dubbele aanhalingstekens in de naam niet toe (omdat Oracle ze niet aankan, zelfs niet met escape-tekens). Of,

c. een instelling hebben voor MySQL versus SQL Server versus anderen, en afhankelijk daarvan de syntaxis van het achteraanhalingsteken, vierkante haakjes of dubbele aanhalingstekens produceren. Zowel dubbele aanhalingstekens als backslash/backquote/nul niet toestaan.

Dit is iets waarvan je zou hopen dat de gegevenstoegangslaag een functie zou hebben, maar PDO heeft dat niet.

Samenvatting van de samenvatting:willekeurige kolomnamen zijn een probleem, dat u het beste kunt vermijden als u er iets aan kunt doen.

Samenvatting van de samenvatting van de samenvatting:gnnnnnnnnnnnnh.



  1. Converteren van DateTime naar INT

  2. Gebruikmakend van caching contrib's pg_prewarm en pg_hibernator in PostgreSQL 9.4.

  3. Retourneert nul als er geen record is gevonden

  4. Hoe door komma's gescheiden waarden naar rijen in orakel te converteren?