Rumah >pangkalan data >tutorial mysql >Bagaimana untuk menguatkuasakan medan unik dalam MySQL sambil mengekalkan ruang belakang?
Pangkalan Data MySQL dengan Medan Unik Mengabaikan Ruang Penamat
Pangkalan data MySQL secara lalai mengabaikan ruang kosong mengekor apabila membandingkan rentetan. Ini boleh menjadi masalah apabila anda mempunyai medan unik yang perlu mempertimbangkan jarak.
Pertimbangkan takrif jadual berikut:
<code class="sql">CREATE TABLE strings ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, string varchar(255) COLLATE utf8_bin NOT NULL, created_ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY string (string) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;</code>
Jika anda cuba memasukkan perkataan 'epal' dengan ruang dihidupkan sebelah kiri, ia akan menyimpan seperti yang diharapkan. Walau bagaimanapun, jika anda cuba memasukkan perkataan dengan ruang di sebelah kanan, ia akan memangkas ruang belakang sebelum menyimpannya.
Potensi Penyelesaian
Satu penyelesaian yang berpotensi ialah menambah aksara khas di sebelah kanan perkataan selepas jarak. Walau bagaimanapun, pendekatan ini memperkenalkan kerumitan tambahan dan mungkin tidak sentiasa praktikal.
Penyelesaian Cadangan
Penyelesaian yang lebih baik adalah dengan memanfaatkan pengumpulan NO PAD MySQL yang diperkenalkan dalam MySQL 8.0 . Pengumpulan jenis NO PAD jangan abaikan ruang kosong mengekor apabila membandingkan rentetan.
Untuk mencipta jadual dengan himpunan NO PAD, gunakan sintaks berikut:
<code class="sql">CREATE TABLE test_ws ( `value` VARBINARY(255) UNIQUE ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;</code>
Dengan pengumpulan ini, anda boleh masukkan nilai dengan dan tanpa mengekori ruang kosong:
<code class="sql">INSERT INTO test_ws (`value`) VALUES ('a'); -- Inserts "a" INSERT INTO test_ws (`value`) VALUES ('a '); -- Inserts "a " SELECT CONCAT('(', `value`, ')') FROM test_ws; -- Output: -- (a) -- (a )</code>
Sementara pendekatan ini menangani isu medan unik mengabaikan ruang penamat, adalah penting untuk ambil perhatian bahawa pengisihan pada lajur sedemikian akan berlaku pada nilai bait, yang mungkin tidak sejajar dengan jangkaan pengguna.
Atas ialah kandungan terperinci Bagaimana untuk menguatkuasakan medan unik dalam MySQL sambil mengekalkan ruang belakang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!