2

問題: 日付列のクエリ連結により、検索の大文字と小文字が区別されます。concat から日付列を削除すると、検索で大文字と小文字が区別されず、予期される結果セットが返されます。これは DEV で発生していますが、QA 環境では発生していません。

どちらの環境も、サーバー、データベース、および接続の照合設定 latin1_swedish_ci は同じですが、Mysql のバージョンが異なります(DEV:5.1.39; QA:5.1.61)

各環境 (エンジン、文字セット) のテーブル属性は同じです:InnoDBlatin1.

QRY:

 select contact_id, lastname, firstname, dob
 from contact
 where concat(lastname,' ',firstname,' ',dob) = 'styles furious 1988-06-18';

大文字と小文字を区別しないクエリが必要です。

どんな助けでも大歓迎です、ありがとう。

4

2 に答える 2

1

CONCAT()とにかく、クライアントで文字列を分割してこれを行うことができるのに、なぜとにかく使用しているのですか?

select contact_id, lastname, firstname, dob
from contact
where lastname = 'styles' and firstname = 'furious' and dob = '1988-06-18'

lastnameおよびfirstname列が両方とも非バイナリであり、大文字と小文字を区別しない照合を使用している限り、このクエリは大文字と小文字を区別しない必要があります。これらの列にインデックスがある場合は、はるかに効率的です

とにかく、絶対に を使用することを主張する場合は、次のようCONCAT()に、常に結果に正しい型と照合順序を強制できます。

select contact_id, lastname, firstname, dob
from contact
where
  convert(concat(lastname, ' ', firstname, ' ', dob) using latin1)
    collate latin1_general_ci = 'styles furious 1988-06-18';

しかし、それは非常に見苦しく非効率的であり、他に選択肢がない場合を除き、本番環境で使用することを検討するべきではありません。

于 2013-01-03T00:02:04.457 に答える
0

両方の大文字バージョンを比較するために、concat と文字列の両方で upper 関数を使用してみましたか?

私が知る限り、 = は常に大文字と小文字が区別されます (私自身は mysql にかなり慣れていないため、これについて 100% ではありませんが、そうなると思います)。行を返す原因となる環境 (テーブルに渡されるデータまたはクエリで比較される値) の間に他の違いがある可能性はありますか?

于 2013-01-02T23:56:32.230 に答える