sql >> Databáze >  >> RDS >> Mysql

Escapování názvů sloupců v příkazech PDO

Standardní způsob ANSI pro vytvoření odděleného identifikátoru je:

SELECT "field1" ...

a pokud je v názvu ", zdvojnásobte jej:

SELECT "some""thing" ...

Bohužel to nefunguje v MySQL s výchozím nastavením, protože MySQL si raději myslí, že dvojité uvozovky jsou alternativou k jednoduchým uvozovkám pro řetězcové literály. V tomto případě musíte použít backticks (jak nastínil Björn) a zpětné lomítko.

Chcete-li správně escapovat zpětné lomítko, udělali byste potřebovat mysql_real_escape_string, protože je závislý na znakové sadě. Pointa je ale sporná, protože ani mysql_real_escape_string ani addlashes neuniknou znaku backquote . Pokud si můžete být jisti, že v názvech sloupců nikdy nebudou jiné znaky než ASCII, můžete se zbavit ručního escapování zpětného lomítka u znaků ` a \.

V každém případě to není kompatibilní s jinými databázemi. Můžete říci MySQL, aby povolila syntaxi ANSI, nastavením možnosti konfigurace ANSI_QUOTES. Podobně se SQL Server ve výchozím nastavení také dusí dvojitými uvozovkami; používá ještě další syntaxi, konkrétně hranaté závorky. Opět jej můžete nakonfigurovat tak, aby podporoval syntaxi ANSI s možností ‘quoted_identifier’.

Shrnutí:pokud potřebujete pouze kompatibilitu s MySQL:

A. používejte zpětné uvozovky a zakažte v názvech zpětné uvozovky, zpětné lomítko a nul, protože jejich escapování je nespolehlivé

Pokud potřebujete kompatibilitu mezi DBMS, buď:

b. používat dvojité uvozovky a vyžadovat, aby uživatelé serveru MySQL/SQL-Server náležitě změnili konfiguraci. Zakázat dvojité uvozovky v názvu (protože Oracle je nezvládne ani escape). Nebo,

C. mít nastavení pro MySQL vs SQL Server vs Others a v závislosti na tom vytvořit buď zadní uvozovky, hranaté závorky nebo dvojité uvozovky. Zakázat dvojité uvozovky i zpětné lomítko/zpětnou uvozovku/nulu.

To je něco, co byste doufali, že vrstva pro přístup k datům bude mít funkci, ale PDO ne.

Shrnutí shrnutí:Problémem jsou libovolné názvy sloupců, kterým je nejlepší se vyhnout, pokud si s tím můžete pomoci.

Shrnutí shrnutí souhrnu:gnnnnnnnnnnnnh.



  1. Více plánů pro identický dotaz

  2. Zobrazit granty v MySQL

  3. Ekvivalent varchar(max) v MySQL?

  4. jaký jdbc jar použít s oracle 11g &jdk 1.6 a jak se připojit k samotnému db