Hướng dẫn mysql like query with spaces - mysql như truy vấn với khoảng trắng

Tôi có một cơ sở dữ liệu MySQL có mã bưu điện trong đó, đôi khi trong cơ sở dữ liệu có các không gian trong mã bưu điện (ví dụ: Ng1 1AB) Đôi khi không có (ví dụ: NG11AB). Simlarly trong truy vấn PHP để đọc từ cơ sở dữ liệu mà người tìm kiếm cơ sở dữ liệu có thể thêm không gian hoặc không. Tôi đã thử các định dạng khác nhau bằng cách sử dụng giống như nhưng dường như không thể tìm thấy một phương tiện tìm kiếm hiệu quả để kết thúc nó sẽ đưa ra cùng một hàng tương ứng (ví dụ: tìm kiếm NG11AB hoặc NG1 1AB để đưa ra 'Bob Smith' ' hoặc bất kể trường hàng tương ứng sẽ là gì).

Bất kỳ đề xuất?

Hỏi ngày 30 tháng 8 năm 2013 lúc 8:52Aug 30, 2013 at 8:52

Hướng dẫn mysql like query with spaces - mysql như truy vấn với khoảng trắng

1

Tôi thậm chí sẽ không bận tâm với LIKE hoặc regex và chỉ cần loại bỏ khoảng trống và so sánh các chuỗi:

SELECT *
FROM mytable
WHERE LOWER(REPLACE(post_code_field, ' ', '')) = LOWER(REPLACE(?, ' ', ''))

Lưu ý rằng tôi cũng chuyển đổi cả hai giá trị thành chữ thường để vẫn khớp chính xác nếu người dùng nhập mã POST chữ thường.

Đã trả lời ngày 30 tháng 8 năm 2013 lúc 8:57Aug 30, 2013 at 8:57

Aleks Galeks gAleks G

55.4K27 Huy hiệu vàng163 Huy hiệu bạc257 Huy hiệu Đồng27 gold badges163 silver badges257 bronze badges

6

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'

Đảm bảo đầu vào PHP của bạn cũng được cắt

Đã trả lời ngày 30 tháng 8 năm 2013 lúc 8:56Aug 30, 2013 at 8:56

Hướng dẫn mysql like query with spaces - mysql như truy vấn với khoảng trắng

AnonymooseanonymouseAnonymoose

2.3496 Huy hiệu vàng35 Huy hiệu bạc68 Huy hiệu Đồng6 gold badges35 silver badges68 bronze badges

1

Giả sử cột của bạn không chỉ là mã bưu điện trong đó: Xóa tất cả các khoảng trống trước khi thực hiện kiểm tra tương tự:

where replace(postcode, ' ', '') like '%NG11AB%'

Nếu các cột của bạn chỉ có mã bưu điện trong đó:

where replace(postcode, ' ', '') = 'NG11AB'

hoặc

where postcode like 'N%G%1%1%A%B'

Regex sẽ làm việc cho cả hai trường hợp. Regex sau đây cho phép các không gian tùy chọn giữa mỗi chữ cái:

where postcode rlike 'N ?G ?1 ?1 ?A ?B' -- use regex

Đã trả lời ngày 30 tháng 8 năm 2013 lúc 8:56Aug 30, 2013 at 8:56

AnonymooseanonymouseBohemian

2.3496 Huy hiệu vàng35 Huy hiệu bạc68 Huy hiệu Đồng89 gold badges565 silver badges702 bronze badges

Bạn đã bao giờ viết một tìm kiếm cho MySQL và gặp vấn đề trong đó tìm kiếm sẽ xử lý không gian đúng cách chưa?

Tôi đã viết một tìm kiếm cho một bảng users và muốn tìm người dùng bằng tên hoặc họ của họ hoặc kết hợp cả hai.

Tôi bắt đầu với một truy vấn như thế này:

SELECT * FROM `users`
  WHERE LOWER(`users`.`first_name`)
      LIKE LOWER(:searchTerm)
    OR LOWER(`users`.`last_name`)
      LIKE LOWER(:searchTerm)

Dưới đây là danh sách cho các trận đấu, cho rằng có một người dùng với

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
0 của James James và
SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
1 của Hồi Doyle,:

  • "%James%" - phù hợpmatch
  • "%Doyle%" - phù hợpmatch
  • "%James D%" - không phù hợp
  • "%J doyle%" - không phù hợp
  • "%James Doyle%" - không phù hợp

Vấn đề xuất hiện khi bạn thêm không gian vào truy vấn tìm kiếm. Tôi đã không muốn chia từ này thành một mảng và thực hiện tìm kiếm cho từng từ. Điều đó sẽ yêu cầu truy vấn cơ sở dữ liệu nhiều lần. Và tôi không muốn cố gắng thực hiện

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
2 và tất cả các bản hack chuỗi này để có được điều này để phù hợp chính xác hơn.

Chà, tôi đã tìm thấy thủ thuật này, nơi bạn có thể tạo các cột giả bằng cách sử dụng

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
3 và sau đó thay thế bất kỳ ký tự không gian nào bằng
SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
4.

Vì vậy, nếu tôi hỏi như thế này:

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
5, điều đó thực sự sẽ trở thành
SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
6 khi nó đến SQL thực tế nơi truy vấn.

Điều này cho phép bạn có được một kết hợp tốt hơn thường xuyên hơn nếu người dùng gõ nhiều nội dung hơn trong một truy vấn có không gian.

SELECT * FROM `users`
  WHERE
    LOWER(CONCAT(`users`.`first_name`,`users`.`last_name`))
      LIKE LOWER(REPLACE(:searchTerm, " ", "%"))

Dưới đây là danh sách các thuật ngữ sẽ được khớp trong truy vấn này:

  • "%James%" - phù hợpmatch
  • "%Doyle%" - phù hợpmatch
  • "%James D%" - không phù hợpmatch
  • "%J doyle%" - không phù hợpmatch
  • "%James Doyle%" - không phù hợpmatch

Vấn đề xuất hiện khi bạn thêm không gian vào truy vấn tìm kiếm. Tôi đã không muốn chia từ này thành một mảng và thực hiện tìm kiếm cho từng từ. Điều đó sẽ yêu cầu truy vấn cơ sở dữ liệu nhiều lần. Và tôi không muốn cố gắng thực hiện
SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
2 và tất cả các bản hack chuỗi này để có được điều này để phù hợp chính xác hơn.

Chà, tôi đã tìm thấy thủ thuật này, nơi bạn có thể tạo các cột giả bằng cách sử dụng

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
3 và sau đó thay thế bất kỳ ký tự không gian nào bằng
SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
4.

Vì vậy, nếu tôi hỏi như thế này:

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
5, điều đó thực sự sẽ trở thành
SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
6 khi nó đến SQL thực tế nơi truy vấn.

Bạn có thể sử dụng không gian trong MySQL không?

Hàm space () trong mysql được sử dụng để trả về một chuỗi bao gồm các ký tự không gian trống được chỉ định..

Varchar có thể có không gian MySQL không?

Nó lưu trữ các giá trị trong một chuỗi có độ dài thay đổi với tiền tố một hoặc hai byte.Kiểu dữ liệu này có thể được đệm với không gian kéo dài để giữ độ dài được chỉ định.Kiểu dữ liệu này không thể được đệm với bất kỳ ký tự nào, bao gồm cả không gian, khi chúng được lưu trữ.Nó không thể chứa hơn 255 ký tự.This data type cannot be padded with any character, including space, when they are stored. It cannot hold more than 255 characters.

SQL có bỏ qua không gian không?

Takeaway: Theo SQL Server, một định danh có không gian dấu vết được coi là tương đương với cùng một định danh với các không gian đó bị xóa.

Không gian kéo dài trong MySQL là gì?

Theo tiêu chuẩn SQL, không gian dấu vết không được gỡ bỏ khi lưu trữ và truy xuất.Trong MySQL, đây là trách nhiệm của công cụ lưu trữ, trong trường hợp này là Innodb;Từ nhân tạo liên quan, chúng tôi đã đọc: Không gian dấu vết không bị cắt khỏi các cột Varchar.Hóa ra, trách nhiệm là sự đối chiếu.trailing spaces are not removed on storage and retrieval. In MySQL, this is a responsibility of the storage engine, in this case InnoDB; from the related manpage, we read: Trailing spaces are not truncated from VARCHAR columns. It turns out, the responsible is the collation.