Masalahnya adalah MySQL mengabaikan spasi putih saat melakukan perbandingan string. Lihathttp://dev.mysql.com/doc/refman/ 5.7/en/char.html
(Informasi ini untuk 5.7; untuk 8.0 ini diubah, lihat di bawah)
Bagian untuk like
operator memberikan contoh untuk perilaku ini (dan menunjukkan bahwa like
tidak menghormati spasi putih):
mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
1 row in set (0.00 sec)
Sayangnya UNIQUE
index tampaknya menggunakan perbandingan string standar untuk memeriksa apakah sudah ada nilai seperti itu, dan dengan demikian mengabaikan spasi kosong. Ini tidak tergantung pada penggunaan VARCHAR
atau CHAR
, dalam kedua kasus penyisipan ditolak, karena pemeriksaan unik gagal. Jika ada cara untuk menggunakan like
semantik untuk UNIQUE
periksa maka saya tidak mengetahuinya.
Yang dapat Anda lakukan adalah menyimpan nilainya sebagai 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)
Sebaiknya Anda tidak melakukan apa pun seperti menyortir menurut abjad pada kolom ini, karena pengurutan akan terjadi pada nilai byte, dan bukan itu yang diharapkan pengguna (sebagian besar pengguna).
Alternatifnya adalah menambal MySQL dan menulis susunan Anda sendiri yang bertipe NO PAD. Tidak yakin apakah seseorang ingin melakukan itu, tetapi jika Anda melakukannya, beri tahu saya;)
Sunting:sementara MySQL memiliki susunan yang bertipe NO PAD, menurut https://dev.mysql.com/doc/refman/8.0/en/char.html :
dan https://dev.mysql.com/ doc/refman/8.0/en/charset-unicode-sets.html
Jadi jika Anda mencoba:
create table test_ws ( `value` varbinary(255) UNIQUE )
character set utf8mb4 collate utf8mb4_0900_ai_ci;
anda dapat memasukkan nilai dengan dan tanpa spasi kosong
Anda dapat menemukan semua koleksi NO PAD yang tersedia dengan:
show collation where Pad_attribute='NO PAD';