ええと、それは二重エスケープだけですが、そうです、それは機能します。その理由は次のとおりです。MySQLでは、LIKE
を使用するときにエスケープの2番目のレイヤーが含まれます。 オペレーター。
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
そのMySQL文字列リテラルを解析すると、LIKEクエリ%L\\u00e4mm\\u00f6n%
との比較が可能になります 。 MySQLは\
を扱うため エスケープとしてのLIKEクエリでは、L\u00e4mm\u00f6n
を含むリテラル文字列と実際に一致します。 。
これは、文字列をリテラル%
を含むクエリ式と照合できるようにするためです。 または_
キャラクター。たとえば、リテラル文字列100%
の列を検索する場合 、100\%
と照合できます (クエリで'100\\%'
として記述されます )そして、100%で始まる文字列ではなく、実際に100%を取得していることを確認してください。
MySQLがLIKEクエリのエスケープと文字列リテラルのエスケープの両方にバックスラッシュを使用しているのは残念です。特に、それらも使用する囲みプログラミング言語で記述している場合は、"services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
--argh!
この動作がANSISQLに準拠しておらず、他のデータベースでは機能しないことを考えると、二重に残念です。 ANSI SQLによると、デフォルトではLIKEクエリにエスケープ文字はないため、リテラルの%
と一致させる場合は または_
自分のエスケープ文字を指定してオプトインする必要があります。例:
something LIKE '100=%' ESCAPE '='
データベース間の互換性のために、常にLIKE
を使用するのが最善です。 ... ESCAPE
フォームを作成し、恐ろしいバックスラッシュ以外のものを選択してください。 (余談ですが、SQL文字列リテラルをエスケープするためのMySQLのバックスラッシュもANSIに準拠していません!ただし、NO_BACKSLASH_ESCAPES sql_mode設定を使用して、この誤動作をオフにすることができます。)
おそらく、services
を壊すことをお勧めします。 それらを単一の文字列列に押しつぶすのではなく、2番目のテーブルに出力します。スキーマを第一正規形にします。そうすれば、ゆっくりと全表スキャンの部分文字列を照合するのではなく、個々の値を簡単に検索できます。