Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Escapando nomes de colunas em instruções PDO


A maneira padrão ANSI de fazer um identificador delimitado é:
SELECT "field1" ...

e se houver um " no nome, dobre-o:
SELECT "some""thing" ...

Infelizmente, isso não funciona no MySQL com as configurações padrão, porque o MySQL prefere pensar que aspas duplas são uma alternativa às aspas simples para literais de string. Nesse caso, você deve usar acentos graves (conforme descrito por Björn) e escape de barra invertida.

Para fazer o escape de barra invertida corretamente, você faria precisa de mysql_real_escape_string, porque é dependente do conjunto de caracteres. Mas o ponto é discutível, porque nem mysql_real_escape_string nem addlashes escapam do caractere backquote . Se você pode ter certeza de que nunca haverá caracteres não ASCII nos nomes das colunas, você pode se safar apenas com a barra invertida de escape manual dos caracteres ` e \.

De qualquer forma, isso não é compatível com outros bancos de dados. Você pode dizer ao MySQL para permitir a sintaxe ANSI configurando a opção de configuração ANSI_QUOTES. Da mesma forma, o SQL Server também engasga com aspas duplas por padrão; ele usa ainda outra sintaxe, ou seja, colchetes. Novamente, você pode configurá-lo para suportar a sintaxe ANSI com a opção ‘quoted_identifier’.

Resumo:se você precisar apenas de compatibilidade com MySQL:

uma. use aspas invertidas e desabilite as aspas invertidas, barra invertida e caractere nulo em nomes porque escapar deles não é confiável

Se você precisar de compatibilidade entre DBMS, faça o seguinte:

b. use aspas duplas e exija que os usuários do MySQL/SQL-Server alterem a configuração apropriadamente. Não permita caracteres de aspas duplas no nome (já que o Oracle não pode lidar com eles, mesmo com escape). Ou,

c. tenha uma configuração para MySQL vs SQL Server vs Others e produza a sintaxe de aspas, colchetes ou aspas duplas dependendo disso. Não permita aspas duplas e barra invertida/aspas invertidas/nul.

Isso é algo para o qual você esperaria que a camada de acesso a dados tivesse uma função, mas o PDO não.

Resumo do resumo:nomes de colunas arbitrários são um problema, é melhor evitar se você puder ajudar.

Resumo do resumo do resumo:gnnnnnnnnnnnh.