sql >> データベース >  >> RDS >> Mysql

PDOステートメントでの列名のエスケープ

    区切られた識別子を実行するANSI標準の方法は次のとおりです。

    SELECT "field1" ...
    

    名前に「」が含まれている場合は、2倍にします。

    SELECT "some""thing" ...
    

    残念ながら、これはデフォルト設定のMySQLでは機能しません。MySQLは文字列リテラルの単一引用符の代わりに二重引用符を使用することを好むためです。この場合、バックティック(Björnによって概説されている)とバックスラッシュエスケープを使用する必要があります。

    バックスラッシュを正しくエスケープするには、します。 文字セットに依存するため、mysql_real_escape_stringが必要です。ただし、mysql_real_escape_stringもaddslashesもバッククォート文字をエスケープしないため、要点は重要ではありません。 。列名にASCII以外の文字が含まれないことが確実な場合は、手動でバックスラッシュを使用して`文字と\文字をエスケープするだけで回避できます。

    いずれにせよ、これは他のデータベースと互換性がありません。構成オプションANSI_QUOTESを設定することにより、ANSI構文を許可するようにMySQLに指示できます。同様に、SQLServerもデフォルトで二重引用符で窒息します。さらに別の構文、つまり角かっこを使用します。ここでも、「quoted_identifier」オプションを使用して、ANSI構文をサポートするように構成できます。

    概要:MySQLとの互換性のみが必要な場合:

    a。バッククォートを使用し、名前にバッククォート、バックスラッシュ、ヌル文字を使用しないようにします。これらをエスケープするのは信頼できないためです

    DBMS間の互換性が必要な場合は、次のいずれかを行います。

    b。二重引用符を使用し、MySQL/SQL-Serverユーザーに構成を適切に変更するように要求します。名前に二重引用符を使用することはできません(Oracleはエスケープされていても処理できないため)。または、

    c。 MySQL vs SQL Server vs Othersの設定があり、それに応じて、バッククォート、角括弧、またはダブルクォート構文のいずれかを生成します。二重引用符とバックスラッシュ/バッククォート/ヌルの両方を禁止します。

    これは、データアクセス層に機能があることを望んでいるものですが、PDOにはありません。

    要約の要約:任意の列名は問題です。助けてくれるなら避けるのが最善です。

    要約の要約の要約:gnnnnnnnnnnnh。



    1. 特定のテーブルを使用するすべてのクエリを検索する

    2. SQLAlchemy ON DUPLICATE KEY UPDATE

    3. Oracle:インデックスでは列の順序は重要ですか?

    4. MariaDBの日付から年を返す4つの関数