問題は、MySQLが文字列比較を行うときに末尾の空白を無視することです。 http://dev.mysql.com/doc/refman/を参照してください5.7 / en / char.html
(この情報は5.7用です。8.0ではこれが変更されました。以下を参照してください)
like
のセクション 演算子はこの動作の例を示します(そしてlike
末尾の空白を尊重します):
mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
1 row in set (0.00 sec)
残念ながら、UNIQUE
indexは、標準の文字列比較を使用して、そのような値がすでに存在するかどうかを確認しているようです。したがって、末尾の空白は無視されます。これは、VARCHAR
の使用とは無関係です。 またはCHAR
、どちらの場合も、一意のチェックが失敗したため、挿入は拒否されます。 like
を使用する方法がある場合 UNIQUE
のセマンティクス 確認してください。わかりません。
できることは、値をVARBINARY
として保存することです。 :
mysql> create table test_ws ( `value` varbinary(255) UNIQUE );
Query OK, 0 rows affected (0.13 sec)
mysql> insert into test_ws (`value`) VALUES ('a');
Query OK, 1 row affected (0.08 sec)
mysql> insert into test_ws (`value`) VALUES ('a ');
Query OK, 1 row affected (0.06 sec)
mysql> SELECT CONCAT( '(', value, ')' ) FROM test_ws;
+---------------------------+
| CONCAT( '(', value, ')' ) |
+---------------------------+
| (a) |
| (a ) |
+---------------------------+
2 rows in set (0.00 sec)
並べ替えは代わりにバイト値で行われるため、この列でアルファベット順に並べ替えるようなことはしたくない方がよいでしょう。これは、ユーザーが期待することではありません(とにかく、ほとんどのユーザー)。
別の方法は、MySQLにパッチを適用し、タイプNOPADの独自の照合を作成することです。誰かがそれをしたいかどうかはわかりませんが、もしそうなら、私に知らせてください;)
編集:一方、によると、MySQLにはタイプNOPADの照合があります。 https://dev.mysql.com/doc/refman/8.0/en/char.html :
および
したがって、試してみると:
create table test_ws ( `value` varbinary(255) UNIQUE )
character set utf8mb4 collate utf8mb4_0900_ai_ci;
末尾の空白の有無にかかわらず値を挿入できます
利用可能なすべてのPADなしの照合は次の場所で見つけることができます:
show collation where Pad_attribute='NO PAD';