1

私はいくつかのクエリのデバッグを行っていましたが、varchar フィールドをリテラルと比較するときに、予期しない (明らかに正しい) TRUE を取得していることに気付きました。具体的には次のとおりです。

  • 問題の行は、自動インクリメント int 主キーと varchar(255) です
  • 単一の行を追加するように設定するには:insert into comp_test(test_string) values('TestString');
  • where test_string='tESTsTRING'句は真です
  • where test_string='TestString '句が真です (最後に空白が埋め込まれます)

そのため、質問を作成しているときに、原因と大文字と小文字の区別を強制する方法を説明する同様の投稿を見つけることができます (BINARY と COLLATE などを使用)。BINARY および COLLATE ソリューションでも、空白のパディングによって句が false になりますか?

私は今、解決策の一部を持っていますが、等価比較がなぜそれほどずさんなのか、誰か説明できますか? 上記の例で、test_string の値が 8 文字の文字列の場合、比較が true と評価される最大 64,000 個のリテラルがあります。それはどのような同等性ですか?それは間違っているように思われ、他のほとんどすべての言語では、1 対 1 の同等性以外は許可されません。

前もって感謝します。

4

1 に答える 1

1

CやFORTRANなどの古い言語やOracleなどの古いDMBSシステムの動作にもかかわらず、MySQLの組み込みの文字列照合システムを使用すると、エンドユーザーは言語固有の照合ルールを指定できます。(ちなみに、JavaやDotNetなどのシステムでは文字列の処理を行います。)

これは本当にクールな機能です。それはあなたが多くの異なる言語のための適切なアルファベット順(===照合)規則によって注文することを可能にします。

この検索句を発行して、必要な種類の一致を取得できます。

WHERE BINARY test_string = 'TestString '

また

WHERE test_string = 'TestString ' COLLATE utf8_bin

また

WHERE test_string = 'TestString ' COLLATE utf8_swedish_ci

データがたまたまスウェーデン語であり、UTF8文字セットに格納されている場合。

http://dev.mysql.com/doc/refman/5.5/en/charset-collat​​e.htmlを参照してください

ただし、これには注意する必要があります。テーブルの照合と一致しないWHERE句の照合を要求すると、SQLが非効率的に実行される可能性があります。

正しい文字セットと照合で列を宣言するのが最善です。そうすると、テーブルのインデックスが設定され、必要なデータをすばやく取得できるようになります。データが実際にバイナリデータである場合(それを知っているのはあなただけです)、テーブルまたは列を次のように宣言できます。

  COLLATE BIN

修飾子。

MySQLのこの部分は、理解するために努力する価値があります。

于 2012-05-24T16:10:22.717 に答える