sql >> Databasteknik >  >> RDS >> Mysql

Escapende kolumnnamn i PDO-satser

ANSI-standardsättet att göra en avgränsad identifierare är:

SELECT "field1" ...

och om det finns ett " i namnet, dubbla det:

SELECT "some""thing" ...

Tyvärr fungerar detta inte i MySQL med standardinställningarna, eftersom MySQL föredrar att tro att dubbla citattecken är ett alternativ till enstaka citattecken för bokstavliga strängar. I det här fallet måste du använda backticks (enligt Björn skisserat) och backslash-escaping.

För att göra backslash escape korrekt, skulle du göra det behöver mysql_real_escape_string, eftersom det är teckenuppsättningsberoende. Men poängen är omtvistad, eftersom varken mysql_real_escape_string eller addslashes undkommer bakåtcitatet . Om du kan vara säker på att det aldrig kommer att finnas icke-ASCII-tecken i kolumnnamnen kan du komma undan med att bara manuellt backa snedstreck-escape tecknen ` och \.

Hur som helst, detta är inte kompatibelt med andra databaser. Du kan säga till MySQL att tillåta ANSI-syntaxen genom att ställa in konfigurationsalternativet ANSI_QUOTES. På samma sätt kväver SQL Server också dubbla citattecken som standard; den använder ännu en syntax, nämligen hakparenteser. Återigen kan du konfigurera den för att stödja ANSI-syntaxen med alternativet "quoted_identifier".

Sammanfattning:om du bara behöver MySQL-kompatibilitet:

a. använd bakåtcitat och tillåt bakåtcitat, omvänt snedstreck och noll i namn eftersom det är opålitligt att undvika dem.

Om du behöver cross-DBMS-kompatibilitet, antingen:

b. använd dubbla citattecken och kräver att MySQL/SQL-serveranvändare ändrar konfigurationen på lämpligt sätt. Tillåt inte dubbla citattecken i namnet (eftersom Oracle inte kan hantera dem ens escaped). Eller,

c. ha en inställning för MySQL vs SQL Server vs Others, och producera antingen syntaxen bakåt, hakparentesen eller dubbla citattecken beroende på det. Tillåt inte både dubbla citattecken och snedstreck/backquote/nul.

Detta är något du hoppas att dataåtkomstlagret skulle ha en funktion för, men PDO har inte det.

Sammanfattning av sammanfattningen:godtyckliga kolumnnamn är ett problem, bäst undvikas om du kan hjälpa det.

Sammanfattning av sammanfattningen av sammanfattningen:gnnnnnnnnnnnh.



  1. Enradsfunktioner i Oracle sql

  2. 2 sätt att konvertera mellan decimal och hexadecimal i MySQL

  3. Villkorlig delad transformation:Exportera data från SQL Server till Oracle- och MySQL-databaser

  4. Om det finns ett sätt jag kan ansluta en MS SQL-tabell till en MySql-tabell i en fråga med MySql?