2009-07-27 20 views
16

Tôi có một truy vấn cho cơ sở dữ liệu sqlite3 cung cấp dữ liệu được sắp xếp. Dữ liệu được sắp xếp trên cơ sở cột là một cột "varchar". Bây giờ, khi tôi thực hiện truy vấnLàm thế nào để thay đổi collation của sqlite3 cơ sở dữ liệu để sắp xếp trường hợp insensitively?

select * from tableNames Order by Name; 

Nó cung cấp dữ liệu như thế này.

 
    Pen 
    Stapler 
    pencil 

Có nghĩa là nó đang xem xét các trường hợp nhạy cảm. Cách tôi muốn là như sau

 
    Pen 
    pencil 
    Stapler 

Vì vậy, những thay đổi nào tôi nên thực hiện trong cơ sở dữ liệu sqlite3 cho các kết quả cần thiết?

liên quan How to set Sqlite3 to be case insensitive when string comparing?

Trả lời

10

Các SQLite Datatypes documentation thảo luận về trình tự đối chiếu người dùng định nghĩa. Cụ thể là bạn sử dụng COLLATE NOCASE để đạt được mục tiêu của mình.

Họ đưa ra một ví dụ:

CREATE TABLE t1(
    a,     -- default collation type BINARY 
    b COLLATE BINARY, -- default collation type BINARY 
    c COLLATE REVERSE, -- default collation type REVERSE 
    d COLLATE NOCASE -- default collation type NOCASE 
); 

và lưu ý rằng:

- Nhóm được thực hiện bằng cách sử dụng chuỗi chiếu NOCASE (tức là giá trị - 'abc' và 'ABC' được đặt trong cùng một nhóm). Số lượng SELECT (*) GROUP BY d FROM t1;

+2

"COLLATE NOCASE" có hoạt động cho bất kỳ ngôn ngữ nào không? Nếu không, làm thế nào có thể sắp xếp trên một trường văn bản trong một trường hợp không nhạy cảm, nếu ngôn ngữ cụ thể không được biết đến tại thời gian biên dịch? –

+0

IIRC sqlite3 là nguyên bản UTF-8, do đó việc đối chiếu sẽ xảy ra theo các quy tắc Unicode UTF-8. Điều này có thể, tất nhiên, không phải là những gì người dùng mong đợi ... –

+0

@moodforaday: Không phải với việc xây dựng trong NOCASE collation. Những gì bạn có thể là để xác định lại collate NOCASE trong ứng dụng của bạn và thực hiện phân loại dựa trên hệ thống hiện tại/người dùng miền địa phương. Chỉ cần đặt tên cho collation tùy chỉnh của bạn là "NOCASE". – wqw

2
select * from tableNames Order by lower(Name); 

Michael van der Westhuizen giải thích trong nhận xét của mình dưới đây lý do tại sao đây không phải là cách hay. Tôi để lại câu trả lời này lên để giữ gìn bình luận của mình và để phục vụ như một cảnh báo cho những người khác có thể có ý tưởng tương tự 'sáng' Tôi đã ;-)

+0

Đây không phải là một ý tưởng tuyệt vời - đặt hàng bởi một hàm mà bạn không có các chỉ mục dựa trên chức năng sẽ dẫn đến các vấn đề về hiệu suất và khả năng mở rộng. Xem câu trả lời của Dror Harari ở trên cho đúng cách để làm điều này trong sqlite3. Nếu bạn đang sử dụng Oracle với chỉ mục dựa trên chức năng ở mức thấp hơn (Tên), điều này sẽ ổn, nhưng không phải trong trường hợp này. –

20

Để sắp xếp nó phân biệt dạng chữ bạn có thể sử dụng ORDER BY Name COLLATE NOCASE

1

Sử dụng câu lệnh này trong cơ sở dữ liệu SQLite của bạn:

PRAGMA case_sensitive_like = false 
+1

Trường hợp nhạy cảm như đã sai đối với các ký tự ASCII và trường hợp nhạy cảm theo mặc định cho các ký tự unicode nằm ngoài phạm vi ASCII. [link] (http://www.sqlite.org/lang_expr.html) –

Các vấn đề liên quan