Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL 5.5 kehilangan spasi tambahan dalam kueri

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat akses DB dengan Hibernate JPA thread-safe?

  2. Grup MySQL Berdasarkan Tanggal Antara

  3. Dapatkan konten file docx yang disimpan di dabase mysql sebagai tipe gumpalan di php

  4. Mysql Suka berisi wildcart memberikan hasil yang tidak terduga

  5. Bergabung dengan 2 tabel di SELECT(MYSQL/PHP)