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

MySQL 5.5 mất dấu cách ở cuối trong truy vấn

Hành vi này là do thiết kế, không chỉ trong MySQL.

Bạn có thể giải quyết vấn đề này trong so sánh bằng cách sử dụng 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)

nhưng không nhiều hơn thế. Điều này sẽ giúp bạn với SELECT s nếu khoảng trắng xuất hiện, ví dụ:trong đầu vào của người dùng cho một tìm kiếm; nhưng nếu bạn thực sự muốn nhập thông tin theo sau khoảng trắng, thì đó sẽ là một vấn đề (bạn không thể có chỉ mục với cả 'a' và 'a').

Xem thêm

Khoảng trắng theo sau trong nhu cầu varchar được xem xét khi so sánh

Bạn có thể hình dung ngược lại các chuỗi trong cột đó và đảo ngược chúng trở lại khi hiển thị chúng. Tất nhiên điều này sẽ phá hủy bất kỳ thứ tự nào dựa trên cột đó, nhưng nếu bạn chỉ kiểm tra sự bình đẳng hoặc sự tồn tại của chuỗi con, nó có thể hoạt động. Dẫn đầu không gian đếm.

Đối với các tìm kiếm bình đẳng, bạn cũng có thể lưu trữ mã hóa base64 của chuỗi, mã này phải duy trì thứ tự từ vựng (tức là thứ tự giữa a và b phải được duy trì giữa base64 (a) và base64 (b)). Hoặc bạn có thể thêm một dấu chấm cuối vào chuỗi ("\ n" có thể hoạt động tốt và không xuất hiện trong các tìm kiếm).

Cuối cùng, nhưng thật rủi ro vì con người không thể phân biệt được sự khác biệt, bạn có thể thay thế khoảng trắng bằng ký tự 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)

Các hàng dường như để bình đẳng, nhưng họ không. Lưu ý rằng trong HTML, khoảng trắng là khoảng trắng và 49824 là   (không gian không đột phá). Điều này ảnh hưởng đến các chức năng chuyển đổi sang HTML và nbsp thực sự là một mã UTF8 có nghĩa là trung thực chuỗi là hai byte, nhưng độ dài của lừa chuỗi thực sự là ba .

Cuối cùng, bạn có thể khai báo cột VARBINARY thay vì VARCHAR , do đó hoàn toàn che giấu những gì đang xảy ra. Có vẻ như đây là giải pháp dễ dàng nhất, nhưng tôi sợ rằng nó có thể khiến bạn thất bại trong vài tuần hoặc vài tháng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết hợp bất hợp pháp các đối chiếu (utf8_unicode_ci, IMPLICIT) và (utf8_general_ci, IMPLICIT) cho hoạt động '='

  2. Chèn số hàng không xác định vào MySQL bằng PHP

  3. mysql chọn để trả về khoảng trống cho tất cả trừ hàng đầu tiên của cột lặp lại

  4. Lưu trữ hình ảnh trong hệ thống tệp và sử dụng mysql để lập chỉ mục

  5. Hiệu suất Hibernate, JDBC và Java trên tập kết quả vừa và lớn