7

エスケープ文字列とそれがデータベースにどのように格納されるかについて混乱しています

MySQLの呼び出しで、バックスラッシュを使用して文字列をエスケープします。

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\'s things'

しかし、phpadminを見ると、値は次のように保存されています。

|Tom's things|

バックスラッシュがデータベースに保存されないのはなぜですか?これにより、この値をjavascriptに読み込んでから渡そうとすると、問題が発生します。javascript文字列は終了します。そもそもキャラクターを脱出したのはこのためです。

MySQLがデータベースに保存される前に「\」バックスラッシュを削除するのはなぜですか?

'\'を使用してデータベースに保存しない場合-文字列としてjavascriptに返すときに、これを処理するための最良の方法は何ですか?文字列としてjavascriptに渡されたときに再びエスケープするには?

4

5 に答える 5

7

まず、特定のエスケープされた形式でデータをデータベースに格納するべきではありません。後で別の形式で抽出したり、何らかの理由でデータを検索したりする必要がある場合は、後で後悔することになります。保存している形式は見栄えがよくなり、データを実際の Javascript に渡すときにコードで Javascript のバックスラッシュを追加する方が適切です。

これが、現在のように動作する理由です。

string'Tom\'s things'内の\'文字エスケープ シーケンスであり、実際には MySQL が SQL 文字列を解析する方法を理解できるようにするためにのみ使用され、データベースにそのまま保存されることはありません。

最初に表示している SQL ステートメントで文字をエスケープする理由'は、それ以外の場合、MySQL は文字列が の後の単一引用符で終わっていないことを知る方法がないため'Tomです。

SQL ステートメントを自分で作成する代わりに、MySQLi または PDO プリペアード ステートメントを使用すると、MySQL を使用すると、何もエスケープする必要なく、値をまったく変更せずに保存できます。いずれにしても、準備済みステートメントをサポートしない MySQL API は非推奨であるため、これは間違いなく推奨されるオプションです。

于 2013-02-10T08:01:55.477 に答える
2

バックスラッシュは「エスケープ文字」として扱われます。バックスラッシュがない場合、文字列は で終わりますTomが、残りs thingsは構文エラーを引き起こします。

は、エスケープされたものを文字列区切り文字として扱わず、次のエスケープされていないものが見つかるまで続行\するように MySQL に指示します。''

このエスケープ文字はクエリ目的でのみ使用され、更新する文字列の一部としては扱われません。

Alvin がコメントで提案したように、バックスラッシュをデータベースに保持したい場合は、別のエスケープされたバックスラッシュを追加して追加する必要があります\\。これにより、クエリは次のようになります。

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\\\'s things'

データベース内のデータは次のようになります。

|Tom\'s things|

文字列リテラルと特殊文字のエスケープについて詳しくは、MySQL マニュアルを参照してください。

ただし、すでにエスケープされた文字列をデータベースに保存することは悪い習慣であることに注意してください。コード内の特殊文字のエスケープに注意する必要があります。

于 2013-02-10T08:00:48.787 に答える
0

これにより、この値をjavascriptに読み込むときに問題が発生します

確かにこれ はしません
それからあなたはあなたのお金を金庫に閉じ込めます、それが奪われたらあなたは金庫メーカーを非難することができます。
しかし、あなたがお金を取り戻し、それが盗まれるとすぐに、あなたはまだこれの金庫を非難することはできません。
今はあなたの責任です。

したがって、JavaScript用にデータをエスケープする必要がある場合は、データをエスケープするだけです。
しかしもちろん、mysql _escape_string()を使用することではありません

于 2013-02-10T08:12:13.373 に答える
0

MySQL では、バックスラッシュは (PHP と同様に) エスケープ文字であるためです。バックスラッシュを保存するには、バックスラッシュ自体をエスケープする必要があります。つまり\\、単一のバックスラッシュを保存します。\\\'最初のバックスラッシュは 2 番目のバックスラッシュをエスケープし、3 番目のバックスラッシュは引用符をエスケープするため、バックスラッシュの後に引用符を格納します。

于 2013-02-10T08:04:32.850 に答える