Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cơ sở dữ liệu MySQL với các trường duy nhất bị bỏ qua dấu cách kết thúc

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 :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển các hàng trong bảng mysql thành cột

  2. Làm cách nào để khử trùng đúng cách dữ liệu nhận được từ một vùng văn bản, khi xuất dữ liệu đó trở lại vùng văn bản?

  3. Làm cách nào để ngăn chặn việc tiêm sql bằng php và mysql

  4. NodeJS đã phản hồi Múi giờ MySQL khác khi tôi tìm nạp trực tiếp từ MySQL

  5. LỖI 1030 (HY000) ở dòng 25:Có lỗi 168 từ công cụ lưu trữ