2011-01-29 40 views
7

Tôi đang viết một ứng dụng cần làm việc trên cả mysql và postgresql. Tôi phải sử dụng like để so sánh một số giá trị.Cú pháp 'LIKE' của SQL

Trong mysql LIKE trường hợp không phân biệt chữ hoa chữ thường. Trong postgresql LIKE phân biệt chữ hoa chữ thường và ILIKE không phân biệt chữ hoa chữ thường.

Cách tốt nhất để thực hiện truy vấn rắn hoạt động trên cả hai trường hợp đối sánh phải phân biệt chữ hoa chữ thường là gì?

PDO có giải pháp cho việc này không?

Trả lời

9

Cách đơn giản nhất để đảm bảo một case-insensitive LIKE là sử dụng cái gì đó như một trong những:

LOWER(column_name) LIKE LOWER(pattern) 
UPPER(column_name) LIKE UPPER(pattern) 

Hoặc bạn có thể lên trường hợp/xuống trường các pattern ngoài SQL và chỉ sử dụng:

LOWER(column_name) LIKE down_cased_pattern 
UPPER(column_name) LIKE up_cased_pattern 

Tôi có xu hướng sử dụng LOWER trong thói quen vì trường hợp thấp hơn dễ đọc hơn và do đó dễ debug hơn.

+4

"Q: Tất cả các tập lệnh đều có chữ hoa và chữ thường? A: Không, thực tế là hầu hết các tập lệnh đều không có trường hợp." (Từ Câu hỏi thường gặp về Unicode) Trong trường hợp chung, bạn không thể dựa vào ký tự chữ thường để có phiên bản chữ hoa. Bạn cũng không thể đếm trên một ký tự chữ thường để ánh xạ tới một ký tự chữ hoa duy nhất - một số ký tự UPPER() cho hai ký tự. Vì vậy, lower() là an toàn hơn, nhưng chỉ một chút. Bạn không thích sống trong thế giới Unicode? –

+1

@Catcall: Một ví dụ điển hình về một ánh xạ ký tự chữ thường đơn cho hai ký tự chữ hoa xuất phát từ ngôn ngữ Đức kỳ lạ: 'UPPER (" ß ")' là '" SS "'. I18N và L10N là một thời gian vui vẻ vui vẻ! Đặc biệt là khi bạn đang đối phó với JIS, SJIS, EUC, và Unicode Nhật Bản cùng một lúc mà không thể đọc được tiếng Nhật (đã ở đó, hãy làm điều đó, vui mừng khi UTF-8 khá chuẩn trong những ngày này). –

3

Đây là công việc của một Database Abstraction Layer.

PDO does not làm những gì bạn đang tìm kiếm nhưng có một vài DAL PHP nếu bạn google for them.

PDO không cung cấp cơ sở dữ liệu trừu tượng; nó không viết lại SQL hoặc mô phỏng các tính năng còn thiếu. Bạn nên sử dụng một lớp trừu tượng đầy đủ nếu bạn cần thiết bị đó.