2009-12-18 18 views
5

Tôi đang phát triển một ứng dụng trong Rails trên OS X bằng cách sử dụng PostgreSQL 8.4. Tôi cần thiết lập cơ sở dữ liệu cho ứng dụng để truy vấn văn bản chuẩn không phân biệt chữ hoa chữ thường. Ví dụ:Bất cứ ai đã thành công bằng cách sử dụng một miền địa phương cụ thể cho một cơ sở dữ liệu PostgreSQL để so sánh văn bản có phân biệt chữ hoa chữ thường?

SELECT * FROM tài liệu ĐÂU title = 'tài liệu đáng kinh ngạc'

nên trả lại kết quả tương tự như:

SELECT * FROM tài liệu ĐÂU title = 'Document Incredible'

Chỉ cần rõ ràng, tôi không muốn sử dụng:

(1) NHƯ trong mệnh đề where hoặc bất kỳ loại khác của toán tử so sánh đặc biệt

(2) citext cho datatype cột hoặc bất kỳ chỉ số cột đặc biệt khác

(3) bất kỳ loại phần mềm toàn văn giống như Sphinx

Điều tôi muốn là đặt ngôn ngữ cơ sở dữ liệu để hỗ trợ so sánh văn bản không phân biệt chữ hoa chữ thường. Tôi đang sử dụng Mac OS X (10.5 Leopard) và đã thử cài đặt Mã hóa thành "LATIN1", với Collation và Ctype đều được đặt thành "en_US.ISO8859-1". Không thành công cho đến nay.

Bất kỳ trợ giúp hoặc đề xuất nào được đánh giá cao.

Cảm ơn!

Cập nhật

Tôi đã đánh dấu một trong những câu trả lời cho là câu trả lời đúng trong sự tôn trọng đối với những ai đáp lại. Tuy nhiên, tôi đã chọn giải quyết vấn đề này khác với đề xuất. Sau khi xem xét lại ứng dụng, chỉ có một vài trường hợp tôi cần so sánh phân biệt chữ hoa với trường cơ sở dữ liệu, vì vậy tôi sẽ tạo các trường cơ sở dữ liệu bóng cho những trường tôi cần so sánh phân biệt chữ hoa chữ thường. Ví dụ: name và name_lower. Tôi tin rằng tôi đã xem qua giải pháp này trên web ở đâu đó. Hy vọng rằng PostgreSQL sẽ cho phép các tùy chọn đối chiếu tương tự với những gì SQL Server cung cấp trong tương lai (ví dụ: DOCI).

Đặc biệt cảm ơn tất cả những ai đã trả lời.

+0

gì sai với một chỉ mục trên 'UPPER (tiêu đề) 'và tìm kiếm với 'UPPER (tiêu đề) = UPPER ('Chuỗi bất kỳ')'? –

+0

Tôi đang sử dụng Ruby on Rails và muốn cho phép khung công tác xử lý càng nhiều SQL càng tốt. Tôi không phải lúc nào cũng sử dụng PostgreSQL cho dự án này. –

Trả lời

1

Bạn có thể cần phải làm một việc gì đó như sử dụng hàm cột để chuyển đổi văn bản của bạn, ví dụ: chuyển đổi thành chữ hoa - ví dụ:

SELECT * FROM documents WHERE upper(title) = upper('incredible document') 

Lưu ý rằng điều này có thể làm hỏng chỉ mục bao gồm chức năng cột trên cột mục tiêu, ví dụ:

CREATE INDEX I1 on documents (upper(title)) 
+0

như những kẻ khác đã nói, làm điều này bởi characteret hoặc miền địa phương không thực sự là một giải pháp hợp lý –

+0

Tại sao điều này không hợp lý? –

+0

@Kevin, một bộ ký tự không phân biệt giữa chữ hoa và chữ thường sẽ lưu trữ hợp lý các ký tự như glyphs trung tính. Không có bảng mã cho bảng chữ cái Latinh sử dụng phổ biến mà thực hiện điều này. Các ngôn ngữ có sẵn chỉ đơn giản là một cách viết tắt để chọn một bộ mã hóa ký tự mặc định tức là bộ ký tự. –

0

Vấn đề của bạn và độc quyền của bạn giống như nói "Tôi muốn bơi, nhưng tôi không muốn phải di chuyển cánh tay của mình".

Bạn sẽ chết đuối khi thử.

+2

Không, tôi đến từ một nền tảng SQL Server, nơi so sánh văn bản không phân biệt chữ hoa chữ thường là chuẩn. –

+1

SQL Server bị hỏng, sau đó. – alvherre

+0

"SQL Server bị hỏng", rất buồn cười. – mark

0

Tôi không nghĩ đó là nội dung hoặc mã hóa được sử dụng cho. Mã hóa là nhiều hơn để chọn một bộ ký tự và không xác định cách xử lý ký tự. Nếu có một thiết lập nó sẽ có trong cấu hình, nhưng tôi đã không nhìn thấy một.

Nếu bạn không muốn sử dụng ilike vì sợ không thể chuyển sang cơ sở dữ liệu khác thì tôi khuyên bạn nên xem xét các tùy chọn ORM có thể có sẵn với ActiveRecord nếu bạn đang sử dụng.

đây là một cái gì đó từ một trong những postgres kẻ đầu: http://archives.postgresql.org/pgsql-php/2003-05/msg00045.php

chỉnh sửa: cố định tài liệu tham khảo riêng cho ngôn ngữ.

+0

và tôi đã được downvoted lý do tại sao? Nếu tôi nói điều gì đó không đúng, tôi rất muốn biết nó là gì. –

+0

@Arthur trong khi tôi không downvote câu trả lời của bạn, tôi sẽ chỉ ra rằng miền địa phương và bộ ký tự có liên quan, nhưng khác nhau. –

+0

ah, tôi bối rối khi trả lời. Tôi đã suy nghĩ mã hóa trong đầu của tôi. cảm ơn vì đã chỉ ra điều đó. Locale chắc chắn sẽ không được sử dụng cho điều đó. Việc mã hóa sẽ chỉ thực sự 'làm việc' nếu có một nhân vật nào đó không có chữ hoa hay cái gì đó hehe. Nếu có - một mục có thể cấu hình giống như nó sẽ nằm trong tập tin cấu hình của postgresql. –

1

Với tất cả các giới hạn bạn đã đặt, có thể cách duy nhất để làm việc đó là xác định toán tử = của riêng bạn cho văn bản. Rất có khả năng nó sẽ tạo ra các vấn đề khác, chẳng hạn như tạo các chỉ mục bị hỏng. Ngoài ra, đặt cược tốt nhất của bạn có vẻ là sử dụng datatype citext; mà vẫn sẽ cho phép những thứ ORM bạn đang sử dụng tạo ra SQL.

(Tôi không nhắc đến khả năng tạo độ nét locale riêng của bạn bởi vì tôi đã không bao giờ nghe nói về bất cứ ai làm việc đó.)

0
SELECT * FROM documents WHERE title ~* 'incredible document'