文字エスケープピット遭遇問い合わせなどのMySQLの

最近問題に遭遇したときのようなMySQLのクエリ、明らかに同じ文字列が、ではなく結果のように、多くのバック後の情報を見つけるために、そして最終的に文字列が問題を免れた、とMySQLのLIKEエスケープときそして通常の文字異なります。

テストではまず見て:

1

2

3

4

5

6

7

mysql> SET @a='\';SELECT @a,@a LIKE '\\';

 

+----+----------------+

| @a | @a LIKE '\\' |

+----+----------------+

|   |              1 |

+----+----------------+

これは、LIKE中への逃避「「\\」見ることができる」LIKEエスケープ文字列をエスケープし、通常は少し異なるを使用しています。

私は、公式文書、エスケープ文字の解釈を確認しました:

バックスラッシュがパーサによって一度取り除かれているためと再びパターンマッチが行われたときに、これは、あります

合致させる単一のバックスラッシュを残して。

MySQLの独自のパーサーは一度脱出し、その後サブ正義の前LIKE結果のパターン。

それは、「\\」の一例である第一の時間は、第二は、「\」のようにエスケープのために「」

文字のエスケープMySQLのテストで見てみましょう

1

2

3

4

5

6

7

mysql> SELECT '%','_';

+----+----+

| % | _ |

+----+----+

| % | _ |

+----+----+

1 row in set

ああ、何もエスケープ(「X」、「b」はフォールバック文字であるような「X」としてエスケープ)、「%」をエスケープし、「_」ではありません。LIKEは、脱出してきました。私はそうすることのMYSQLの目的はそれLIKEの互換性のためにあるんです。

要約、LIKEエスケープ文字列、二回の合計、最初の時間はありません「%」をエスケープし、「_」の下で、二回目は、すべてエスケープ。特殊文字をエスケープすることはhttp://dev.mysql.com/doc/refman/5.1/en/string-literals.html#character-escape-sequencesで見つけることができます

エスケープLIKE最初「残りの文字列を」「に「\\」\」エスケープして、文字列の残りの部分、「」脱出を置き換えるとして見ることができます。通常は満たしていない、「\」、特別な分析LIKEは感知できないです。

特殊文字のフィルタリングなどのPHPのバージョン

1

2

3

function likeEscape($str) {

    return strtr($strarray('%'=>'\%''_'=>'\_''\'=>'\\\\'));

}

最後の二重のバックスラッシュバックスラッシュは、実際には、8に1ターン4を回したが、PHPで文字列を変換する必要がある、周りにここで少し、あなたはそれについて考える、問題がある、あなたがメッセージを残すことができることに注意してください

发布了29 篇原创文章 · 获赞 9 · 访问量 3万+

おすすめ

転載: blog.csdn.net/HAOXUAN168/article/details/104087348