2011-02-05 2 views
1

키릴 문자가있는 SQLite 데이터베이스가 있습니다. 예 다음 행Qt에서 SQLite로 대소 문자를 구별

CREATE TABLE customer (
    id INTEGER PRIMARY KEY, 
    name TEXT, 
    surname TEXT 
); 

두 가정하자이 같다 :

"153 | Иван | Попов" 
"243 | Ivan | Popov" 

실제로 러시아어, 영어로 작성된 동일한 이름과 성이다.

저는 내 프로그램에서 C++과 Qt를 사용합니다. 이름 또는 성 열에 특정 문자열을 포함하는 행을 선택하고 싶습니다. I는 QSqlTableModel를 사용하므로

I 단순히 SQL 쿼리와 (SQL 쿼리 단지 WHERE 일부) 필터를 사용 I 신분증과 (필터의 '이반'올바른 행을 표시 설정

void filterTable(QString filter) 
{ 
    QString query; 
    if(!filter.isEmpty()) 
    { 
     //I've added the wildcards to be able to search 
     //using only subset of the name or surname 
     query += "name LIKE '%" + filter "%' OR "; 
     query += "surname LIKE '%" + filter "%'"; 
    } 
    mySqlTableModel->setFilter(query); 
} 

243). 그러나 'иван'와 동일하게하려고 시도하면 'Иван', 'ван'등 올바른 항목이 표시되지만 표시되지 않습니다. 그것은 쿼리가 마치 키릴 문자로 대소 문자를 구분하는 경우에만 작동하는 것처럼 보이지만 라틴 문자로 완벽하게 작동합니다.

저는 ICU에 대해 알고 있고 이미 사용하도록 설정했습니다. 작동 :

$ sqlite3 
$ SELECT 'Иван' like 'иван'; 
1 

그래서 내 프로그램에서 내 검색어가 키릴 문자를 사용할 때 대소 문자를 구분하는 이유를 이해할 수 없습니까? 어떻게 든 Qt의 SQL 쿼리 구현과 관련이 있습니까?

답변

1

기본적으로 SQLite는 ASCII 문자에 대해서만 대/소문자 구분을 지원합니다. 유니 코드 케이스에 대한 지원을 원하면 define your own UPPER/LOWER functionscollation이어야합니다.

+1

대소 문자를 구분하지 못하도록 SQLite 용 ICU 확장을 이미 사용하도록 설정했습니다. 몇 가지 테스트 (그 중 하나가 문제의 끝에 나열되어 있습니다) 그 케이스 무감각 sqlite3에서 작동하지만 그것을 증명하지 Qt를 실행했습니다. 문제는 드라이버의 Qt 구현에 어딘가에 묻혀 있다고 생각합니다. 하지만 정확히 어디 있는지 모르겠습니다. – ashagi

관련 문제