0

mysql のリクエストで問題が発生しています...まず、テーブルには次のエントリがあります。

ここに画像の説明を入力

Forum des Halles, niveau - 4, rue l\'Orient-Express が重複している理由を推測しようとしています。次の mysql リクエストを試しました。

SELECT * FROM geocode where initial_req LIKE '%Forum des Halles, niveau - 4, rue l\'Orient-Express%'

検索結果はありません

SELECT * FROM geocode where initial_req LIKE "%Forum des Halles, niveau - 4, rue l\'Orient-Express%"

検索結果はありません

SELECT * FROM geocode where initial_req LIKE "%Forum des Halles, niveau - 4, rue l'Orient-Express%"

検索結果はありません

SELECT * FROM geocode where initial_req LIKE "%l\'Orient%"

検索結果はありません

SELECT * FROM geocode where initial_req LIKE "%l\'%"

検索結果はありません

SELECT * FROM geocode where initial_req LIKE "%\'Orient%"

2つの結果!!!

理由がわかりません!印刷物はまったく同じで、オリエントが機能しているように見えます。何が起こっているのか本当に当惑しています...助けてもらえますか?

4

1 に答える 1

0

あなたの文字列は次のとおりです。

...rue l\'Orient... (クエリでエスケープする必要がある 2 つの特殊文字を含む)

LIKE と一致させるには、次を使用する必要があります。

'%\\\'オリエント%'

\はエスケープする必要があるため、\\ を使用する必要があり、アポストロフィもエスケープする必要がある特殊な文字であるため、'は\'として表現する必要があります。

それで全部です。

したがって、最後のクエリを除いて、パターンはl'Orientと一致します (そして、テーブルにそのようなものはありません) が、l\'Orientと一致する必要があります

...そして、最後のクエリは'Orientと一致するため、機能します。

ところで: この文字列は Mysql プロンプトに貼り付けるために渡したものです。PHP や Java コードなどから使用する場合は、これらの言語での文字列のエスケープにも注意する必要があるため、ここに示されているよりも多くのバックスラッシュが必要になる場合があります (2 倍の数)。 -したがって、6つのバックスラッシュが機能すると言います-コード内にあります)。

クエリが私のものと同じように見えることを確認するには-PHPで-印刷するだけです-バックスラッシュの数が2倍少ないことがわかります.この量は実際のクエリになります-PHPコードで表示されるものではありません.

もちろん、mysql/mysqli エスケープ ルーチンを使用する場合は異なります ;-) すべてを考慮する必要があります。

MYSQL 文字列リテラルを読み取り、特殊文字をエスケープする

要約:

mysql コンソールでクエリを入力する場合、PHP の文字列内に埋め込まれている場合、エスケープ ルーチンを使用するかどうかは別の話です。mysql プロンプトから開始し、動作する場合は PHP で調整します。

于 2013-11-09T18:44:14.453 に答える