sql >> データベース >  >> RDS >> Mysql

MySQL:ユニコードエンティティのクエリ

    ええと、それは二重エスケープだけですが、そうです、それは機能します。その理由は次のとおりです。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番目のテーブルに出力します。スキーマを第一正規形にします。そうすれば、ゆっくりと全表スキャンの部分文字列を照合するのではなく、個々の値を簡単に検索できます。



    1. MongoクラスターをSSLで保護する

    2. ユーザーアカウント管理、役割、権限、認証PHPおよびMySQL-パート4

    3. MySQLレーベンシュタイン

    4. エラー1115(42000):不明な文字セット:'utf8mb4'