Vấn đề là MySQL bỏ qua khoảng trắng theo sau khi thực hiện so sánh chuỗi. Xem http://dev.mysql.com/doc/refman/ 5.7 / vi / char.html
(Thông tin này dành cho 5.7; đối với 8.0, điều này đã thay đổi, xem bên dưới)
Phần dành cho like
toán tử đưa ra một ví dụ cho hành vi này (và cho thấy rằng like
có tôn trọng khoảng trắng ở cuối):
mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
1 row in set (0.00 sec)
Rất tiếc, UNIQUE
chỉ mục dường như sử dụng so sánh chuỗi tiêu chuẩn để kiểm tra xem đã có giá trị như vậy chưa và do đó bỏ qua khoảng trắng ở cuối. Điều này độc lập với việc sử dụng VARCHAR
hoặc CHAR
, trong cả hai trường hợp, phần chèn bị từ chối do việc kiểm tra duy nhất không thành công. Nếu có một cách để sử dụng like
ngữ nghĩa cho UNIQUE
kiểm tra thì tôi không biết.
Những gì bạn có thể làm là lưu trữ giá trị dưới dạng 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)
Tốt hơn là bạn không muốn làm bất cứ điều gì như sắp xếp theo thứ tự bảng chữ cái trên cột này, vì thay vào đó, việc sắp xếp sẽ xảy ra trên các giá trị byte và đó sẽ không phải là điều người dùng mong đợi (dù sao thì hầu hết người dùng).
Giải pháp thay thế là vá MySQL và viết đối chiếu của riêng bạn thuộc loại KHÔNG PAD. Không chắc ai đó có muốn làm điều đó hay không, nhưng nếu bạn có, hãy cho tôi biết;)
Chỉnh sửa:trong khi đó MySQL có các đối chiếu thuộc loại KHÔNG PAD, theo https://dev.mysql.com/doc/refman/8.0/en/char.html :
và https://dev.mysql.com/ doc / refman / 8.0 / en / charset-unicode-sets.html
Vì vậy, nếu bạn thử:
create table test_ws ( `value` varbinary(255) UNIQUE )
character set utf8mb4 collate utf8mb4_0900_ai_ci;
bạn có thể chèn các giá trị có và không có khoảng trắng ở cuối
Bạn có thể tìm thấy tất cả các đối chiếu NO PAD có sẵn với:
show collation where Pad_attribute='NO PAD';