Perilaku ini dirancang, tidak hanya di MySQL.
Anda dapat mengatasinya di perbandingan dengan menggunakan 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)
tapi tidak lebih. Ini akan membantu Anda dengan SELECT
s jika spasi putih muncul mis. dalam input pengguna ke pencarian; tetapi jika Anda ingin benar-benar memasukkan informasi spasi putih, itu akan menjadi masalah (Anda tidak dapat memiliki indeks dengan 'a' dan 'a ').
Lihat juga
Mengikuti spasi kosong dalam kebutuhan varchar untuk dipertimbangkan sebagai perbandingan
Anda bisa membayangkan mundur string di kolom itu, dan balikkan kembali saat menampilkannya. Tentu saja ini akan merusak pemesanan apa pun berdasarkan kolom itu, tetapi jika Anda hanya menguji kesetaraan atau keberadaan substring, itu mungkin berhasil. Terkemuka spasi memang diperhitungkan.
Untuk pencarian kesetaraan, Anda juga dapat menyimpan pengkodean base64 dari string, yang seharusnya mempertahankan urutan leksikografis (yaitu, urutan antara a dan b harus dipertahankan antara base64(a) dan base64(b)). Atau Anda dapat menambahkan terminator pada string ("\n" dapat bekerja dengan baik dan tidak muncul dalam penelusuran).
Terakhir, tetapi berisiko karena manusia tidak dapat membedakannya, Anda dapat mengganti spasi dengan karakter 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)
Baris tampak menjadi sama, tetapi mereka tidak. Perhatikan bahwa dalam HTML spasi adalah spasi, dan 49824 adalah
(ruang tidak putus). Ini memengaruhi fungsi yang mengonversi HTML ke sana kemari, dan nbsp yang sebenarnya merupakan titik kode UTF8 berarti jujur string adalah dua byte, tetapi panjangnya tertipu string sebenarnya tiga .
Akhirnya Anda dapat mendeklarasikan kolom VARBINARY
bukannya VARCHAR
, sehingga benar-benar menyembunyikan apa yang terjadi. Kelihatannya seperti solusi termudah, tapi saya khawatir itu akan mengganggu Anda beberapa minggu atau bulan ke depan.