8

MySQLでそのようなテーブルを作成しました:

DROP TABLE IF EXISTS `barcode`;
CREATE TABLE `barcode` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(40) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


INSERT INTO `barcode` VALUES ('1', 'abc');

INSERT INTO `barcode` VALUES ('2', 'abc ');

次に、テーブル バーコードからデータをクエリします。

SELECT * FROM barcode WHERE `code` = 'abc ';

結果は次のとおりです。

+-----+-------+
|  id | code  |
+-----+-------+
|  1  |  abc  |
+-----+-------+
|  2  |  abc  |
+-----+-------+

しかし、結果セットは1レコードだけにしたいです。私は次の方法で回避します:

SELECT * FROM barcode WHERE `code` = binary 'abc ';

結果は 1 レコードです。しかし、マッピングテーブルからクエリを生成するためにMySQLでNHibernateを使用しています。では、このケースを解決するにはどうすればよいですか?

4

6 に答える 6

9

それに対する他の修正はありません。単一の比較を として指定するか、binaryデータベース接続全体を に設定しますbinary。(SET NAMES binary他の副作用があるかもしれません!)

基本的に、その「遅延」比較は、ハードコードされた MySQLの機能です。それを無効にするには(必要に応じて!)、binary明らかにすでに行っている比較を使用できます。これは「回避策」ではなく、実際の修正です。

MySQLマニュアルから:

すべての MySQL 照合は PADSPACE 型です。これは、MySQL のすべての CHAR および VARCHAR 値が末尾のスペースに関係なく比較されることを意味します。

もちろん、ユーザーの観点から同じ結果を達成する可能性は他にもたくさんあります。

  • WHERE field = 'abc ' AND CHAR_LENGTH(field) = CHAR_LENGTH('abc ')
  • WHERE field REGEXP 'abc[[:space:]]'

これらの問題は、高速インデックス ルックアップを事実上無効にするため、クエリで常にフル テーブル スキャンが行われることです。大きな違いを生む巨大なデータセット。

繰り返し PADSPACEますが、MySQL の [VAR]CHAR 比較のデフォルトです。を使用して無効にすることができます(そして無効にする必要があります)BINARY。これは、これを行う意図的な方法です。

于 2012-04-27T07:55:33.520 に答える
2

正規表現マッチングで試すことができます:

SELECT * FROM barcode WHERE `code` REGEXP 'abc[[:space:]]'
于 2012-04-27T07:53:10.783 に答える
1

ワイルドカード (%) を使用して LIKE を使用すると、予期しない結果が生じるようなケースに取り組んでいました。STRCMP(text1, text2)検索中に、2 つの文字列を比較する mysql の文字列比較機能も見つけました。ただし、 BINARY を LIKE とともに使用すると、問題が解決しました。

SELECT * FROM barcode WHERE `code` LIKE BINARY 'abc ';
于 2014-06-17T07:04:48.980 に答える
0

私はあなたが1つの結果だけを望んでいると仮定しています.LIMIT

SELECT * FROM barcode WHERE `code` = 'abc ' LIMIT 1;

正確な文字列一致を行うには、使用できますCollation

 SELECT *
 FROM barcode
 WHERE code COLLATE utf8_bin = 'abc';
于 2012-04-27T07:47:55.917 に答える
0

あなたはこれを行うことができます:

SELECT * FROM barcode WHERE `code` = 'abc ' 
AND CHAR_LENGTH(`code`)=CHAR_LENGTH('abc ');
于 2012-04-27T07:55:04.217 に答える