1

重複の可能性:
今日、mysql_real_escape_string()は一重引用符と二重引用符をエスケープしています

一重引用符と円記号には特別な意味があることを理解しています。そのため、文字通りの意味で解釈する場合は、エスケープする必要があります。

私が理解している限り、mysqlクエリで文字列を表す二重引用符は許可されていません(この仮定が正しい場合、これが文字列をエスケープする唯一の理由ですか?)。文字列を表す代わりに一重引用符を使用する必要があります。

そして、NULLはどうですか?二重引用符とNULLをエスケープする必要がある理由を理解するための具体的な例を探しています。

付け加えると、私はすでにstackoverflowでここを検索しましたが、ほとんどの例は私がすでに理解している一重引用符を参照していることがわかります...しかし、二重引用符の背後にある理由を理解する必要があり、その例を見つけることができません...

4

2 に答える 2

1

デフォルトモードでは、MySQLでは文字列リテラルを一重引用符または二重引用符で囲むことができます。

SELECT 'single', "double"

他のDBMSとの互換性のため、およびMySQLモードがに設定されている場合に備えてANSI_QUOTES、ほとんどのSQL作成者は一重引用符を使用して文字列リテラルを指定します。二重引用符を使用する利点は実際にはありません。(そして、誰かがMySQLサーバーセッションで変数を変更したときにクエリが「壊れて」しまうような方法でクエリを作成するのはなぜですか。)

したがって、簡単な答えは、すべての場合に二重引用符をエスケープする必要はないということです。

SELECT 'Bob cried "Wheeeee!"'

場合によっては、エスケープする必要があります。

SELECT "Sue screamed \"Stop!\""

ただし、どのような場合でも二重引用符をエスケープしても問題はありません。

SELECT 'Bob cried \"Wheeeee!\"', "Sue screamed \"Stop!\""
于 2013-02-01T02:07:06.197 に答える
1

マニュアルから;The mysql client truncates quoted strings containing NUL characters if they are not escaped

バイナリデータを文字列列(BLOB列など)に挿入する場合は、特定の文字をエスケープシーケンスで表す必要があります。バックスラッシュ(“ \”)と、文字列の引用に使用される引用文字はエスケープする必要があります。特定のクライアント環境では、NULまたはControl+Zをエスケープする必要がある場合もあります。mysqlクライアントは、エスケープされていない場合はNUL文字を含む引用符で囲まれた文字列を切り捨て、エスケープされていない場合はWindowsのEND-OF-FILEに対してControl+Zが使用される場合があります。これらの各文字を表すエスケープシーケンスについては、表9.1「特殊文字のエスケープシーケンス」を参照してください。

参照:http ://dev.mysql.com/doc/refman/5.0/en/string-literals.html#character-escape-sequences

また、二重引用符をエスケープする必要はありませんが、文字列を操作する場合、これは適切な方法ではないと思います。

# intead of this
INSERT INTO table (1, "John's cats")
# preferred by many programmer
INSERT INTO table (1, 'John\'s cats')
# but needs to escape here 
"INSERT INTO table (1, \"John's cats\")"
于 2013-02-01T02:20:11.000 に答える