9

どうやら非常にまれな問題ですが、IMO は非常に厄介で間違っています: MySQL の末尾の空白は比較に使用されません:

mysql> SELECT "A" = "A ";
+------------+
| "A" = "A " |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

これは、次のシナリオで特に問題になります。

mysql> SELECT COUNT(*) FROM eq WHERE name != TRIM(name);
+------------+
| COUNT(*)   |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

mysql> UPDATE eq SET name=TRIM(name);
Query OK, 866 row affected (0.01 sec)
Rows matched: 650907  Changed: 866  Warnings: 0

空白を適切に処理するように MySQL を設定する方法はありますか?

4

3 に答える 3

6

マニュアルによると、簡単な修正の 1 つは、LIKE を使用することです。

SQL 標準に従って、LIKE は文字単位で照合を実行するため、= 比較演算子とは異なる結果が生成される可能性があります。

...

特に、末尾のスペースは重要です。これは、= 演算子で実行される CHAR または VARCHAR の比較には当てはまりません ...

ワイルドカードを使用しない限り、これは=. このスタックオーバーフローの質問は、仮定をサポートしているようです: Equals(=) vs. LIKE

STRCMP()がホワイトスペースよりも厳密かどうかはマニュアルに記載されておらず=、今のところ試すことはできません。これも、なぜ =が使用されていないかが明確になるため、検討する価値があるかもしれません。

tombom で提案されているバイナリ比較もオプションですが、他の副作用 (ウムラウトのより厳密な比較などA)Äが必要な場合とそうでない場合があります。この質問でバイナリ比較を使用した場合の影響に関する詳細情報。

于 2012-07-02T13:56:17.260 に答える
2

あなたはLIKEを使うことができます

SELECT "A" LIKE "A ";

0 を返しますが、

SELECT "A" LIKE "A";

1 を返します

于 2012-07-02T13:56:03.987 に答える
2

バイナリ比較は魔法の言葉です。

MySQL マニュアルのバイナリ比較

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0
于 2012-07-02T13:56:33.183 に答える