この動作は、MySQLだけでなく、仕様によるものです。
比較で回避できます BINARY
を使用する :
mysql> select version(), 'a' = 'a ', BINARY 'a' = BINARY 'a ';
+-------------+------------+--------------------------+
| version() | 'a' = 'a ' | BINARY 'a' = BINARY 'a ' |
+-------------+------------+--------------------------+
| 5.5.25a-log | 1 | 0 |
+-------------+------------+--------------------------+
1 row in set (0.00 sec)
しかし、それ以上ではありません。これは、SELECT
で役立ちます s空白が表示される場合(例:検索へのユーザー入力。ただし、実際に空白で追跡された情報を入力する場合は、問題が発生します(「a」と「a」の両方を含むインデックスを作成することはできません)。
も参照してください
おそらくリバース その列の文字列を逆にして、表示するときに元に戻します。もちろん、これはその列に基づく順序付けを破壊しますが、同等性または部分文字列の存在のみをテストする場合は、機能する可能性があります。 リーディング スペースは重要です。
等式検索の場合、文字列のbase64エンコーディングを保存することもできます。これは、辞書式順序を維持する必要があります(つまり、aとbの間の順序は、base64(a)とbase64(b)の間で維持する必要があります)。または、文字列にターミネータを追加することもできます( "\ n"はうまく機能し、検索に表示されない可能性があります)。
最後に、人間には違いがわからないため危険です。スペースをUTF8文字(49824)に置き換えることができます:
mysql> select concat ('\'a', char(49824),'\'') AS tricked,
concat ('\'a', ' ' ,'\'') as honest,
concat ('\'a', char(49824),'\'') =
concat ('\'a', ' ' ,'\'') as equals;
+---------+--------+--------+
| tricked | honest | equals |
+---------+--------+--------+
| 'a ' | 'a ' | 0 |
+---------+--------+--------+
1 row in set (0.00 sec)
行は見える 等しくなるが、そうではない。 HTMLでは、スペースはスペースであり、49824は
であることに注意してください。 (ノーブレークスペース)。これは、HTMLとの間で変換する関数に影響します。nbspが実際にはUTF8コードポイントであるということは、正直であることを意味します。 文字列は2バイトですが、トリックの長さ 文字列は実際には3 。
最後に、列VARBINARY
を宣言できます VARCHAR
の代わりに 、したがって、何が起こっているのかを完全に隠します。最も簡単な解決策のように見えますが、数週間または数か月後にはあなたを噛むかもしれないと私は恐れています。