Mysql
 sql >> Base de données >  >> RDS >> Mysql

Échappement des noms de colonne dans les instructions PDO

La manière standard ANSI de créer un identifiant délimité est la suivante :

SELECT "field1" ...

et s'il y a un " dans le nom, doublez-le :

SELECT "some""thing" ...

Malheureusement, cela ne fonctionne pas dans MySQL avec les paramètres par défaut, car MySQL préfère penser que les guillemets doubles sont une alternative aux guillemets simples pour les littéraux de chaîne. Dans ce cas, vous devez utiliser des backticks (comme indiqué par Björn) et une barre oblique inverse.

Pour faire l'échappement antislash correctement, vous soudriez besoin de mysql_real_escape_string, car il dépend du jeu de caractères. Mais le point est discutable, car ni mysql_real_escape_string ni les addlashes n'échappent au caractère backquote . Si vous pouvez être sûr qu'il n'y aura jamais de caractères non-ASCII dans les noms de colonne, vous pouvez vous en sortir en esquivant manuellement les caractères ` et \.

De toute façon, ce n'est pas compatible avec d'autres bases de données. Vous pouvez indiquer à MySQL d'autoriser la syntaxe ANSI en définissant l'option de configuration ANSI_QUOTES. De même, SQL Server s'étouffe également avec les guillemets doubles par défaut; il utilise encore une autre syntaxe, à savoir les crochets. Encore une fois, vous pouvez le configurer pour prendre en charge la syntaxe ANSI avec l'option "quoted_identifier".

Résumé :si vous n'avez besoin que de la compatibilité MySQL :

un. utiliser des guillemets et interdire les guillemets, la barre oblique inverse et le caractère nul dans les noms car leur échappement n'est pas fiable

Si vous avez besoin d'une compatibilité inter-SGBD, vous pouvez :

b. utilisez des guillemets doubles et demandez aux utilisateurs de MySQL/SQL-Server de modifier la configuration de manière appropriée. Interdire les guillemets doubles dans le nom (car Oracle ne peut pas les gérer même échappés). Ou,

c. avoir un paramètre pour MySQL vs SQL Server vs Others, et produire la syntaxe backquote, crochet ou double-quote en fonction de cela. Interdire les guillemets doubles et les barres obliques inverses/backquote/nul.

C'est quelque chose pour lequel vous espériez que la couche d'accès aux données aurait une fonction, mais pas PDO.

Résumé du résumé :les noms de colonnes arbitraires sont un problème, mieux vaut les éviter si vous pouvez l'aider.

Résumé du résumé du résumé :gnnnnnnnnnnnnh.