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

Database MySQL dengan bidang unik mengabaikan spasi akhir

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';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:Variabel sistem tidak dikenal 'query_cache_size'

  2. Pilih catatan bulan saat ini mysql dari kolom stempel waktu

  3. Mengapa driver QMYSQL tidak dimuat di QT5.2?

  4. Kueri terkait kinerja Phalcon

  5. Bagaimana cara menyimpan array di MySQL?