2012-10-31 3 views
5

현재 전체 텍스트 검색 기능을 갖춘 IOS 앱을 만들고 있습니다. 검색은 sqlite 데이터베이스에서 select 문을 수행하여 수행되지만 데이터베이스의 많은 값에 스칸디나비아 문자 (Æ, Ö, Á 등)가 포함되어 있고 16 진수 값을 가져 오지 않고 명령문을 변환하는 데 문제가 있습니다. 편지들. 여기 북유럽 문자를 보존하면서 SQLite를위한 NSString을 올바르게 인코딩하는 방법

내가 현재하고 있어요 무엇 :

const char *sql = [[NSString stringWithFormat: 
        @"SELECT %@\ 
        FROM Customer c\ 
        JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\ 
        WHERE cm.Name LIKE '%%%@%%'\ 
        ORDER BY cm.Name", kCustomerSelect, searchString] UTF8String]; 

지금 kCustomerSelect 내가 선택하려는 열을 포함하는 상수이며,되는 searchString은 사용자 입력이 포함되어 있습니다.

이것은 일반 라틴 문자의 매력처럼 작동하지만, 예를 들어 Ö를 searchString으로 전달하면 st \ xc3 \ xb6이됩니다. 나는 UTF8로 인코딩 된 문자열을 단순히 로그 아웃하면 스트링의 정확한 표현을 제공하지 못한다는 것을 알고있다. 그러나 문제는 나의 select 문이 어떤 결과도주지 않는다는 것이다.

쿼리를 실행하기 전에 sqlite3_open()을 호출하고 SQLite 설명서 *에서 "sqlite3_open() 또는 sqlite3_open_v2()가 호출되고 기본 SQL Server 2005에서 UTF-16이 호출되면 데이터베이스의 기본 인코딩은 UTF- sqlite3_open16()이 사용되면 바이트 순서. "*.

cStringUsingEncoding:으로 바꾸고 다른 인코딩을 시도하여 다른 인코딩을 사용해 보았습니다. 그들 중 누구도 일하지 않았습니다 (나는 그들을 기대하지 않았지만 적어도 시도하고 싶었습니다).

모든 도움이나 조언을 보내 주시면 감사하겠습니다.

편집 이제 SQLite Database Browser를 사용하여 데이터베이스에서 동일한 SELECT 문을 실행했지만 아무런 결과도 얻지 못했습니다. 이것은 내가 FTS3을 사용하여 내 Customer_Metadata 테이블을 만드는 것과 관련이 있다고 생각하게합니다.

MrDresden

답변

0

FTS3을 사용하는 경우 기본 토크 나이저는 원하는 것을 수행하지 않습니다.

특정 토크 나이가하여 FTS 테이블, 기본 토크 나이, "간단한"를 작성하는 데 사용되는 가상 CREATE TABLE 문, 사용의 일부로서 지정하지 않으면

.단순 토큰izer는 다음 규칙에 따라 문서 또는 기본 FTS 전체 텍스트 쿼리에서 토큰을 추출합니다.

용어는 적합한 문자가 모두 영숫자이고 유니 코드 코드 포인트가 더 큰 모든 문자가 더 큰 연속 문자 시퀀스입니다. 128보다 크거나 같아야합니다. 다른 모든 문자는 문서를 용어로 나눌 때 삭제됩니다. 그들의 유일한 기여는 인접한 용어를 분리하는 것입니다.

-http://www.sqlite.org/fts3.html#tokenizer

당신은 사용자 정의 토크 나이를 사용하거나 ICU 또는 unicode61 tokenizers 당신을 위해 작동되는지 확인해야합니다. 그 정보는 위의 링크 된 문서에 있습니다.

+0

안타깝게도 ICU와 Unicode61을 모두 사용해 본 후에도 결과가 나오지 않습니다. 내가 말한대로 맞춤형 토크 나이저를 만들어야 할 수도 있습니다. – Hrafn

0

은 다음과 같이 쿼리를 작성 :

const char *sql = [[NSString stringWithFormat: 
       @"SELECT %@\ 
       FROM Customer c\ 
       JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\ 
       WHERE cm.Name LIKE ?\ 
       ORDER BY cm.Name", kCustomerSelect] UTF8String]; 

을 당신이 문을 준비,되는 searchString 결합 후 :만큼 데이터베이스가 UTF-8로

sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%%%@%%", searchString] UTF8String], -1, SQLITE_TRANSIENT); 

을, 다음 그리스어, 러시아어, 일본어로 텍스트를 입력 할 수 있으며 물론 다양한 스칸디나비아 문자를 사용할 수 있습니다.

편집 : 방금 편집을 보았습니다. 데이터가 제대로 작성되지 않았다면 분명히 문제가 될 것입니다.

+0

도움 주셔서 감사합니다. 나는 당신의 제안을 시도했지만 여전히 "특별한"글자에 대한 결과를 얻지 못하고 있습니다. 필자는 FTS3 테이블을위한 특별한 토카 나이저를 찾아야한다고 생각하기 시작했습니다. – Hrafn

+0

'sqlite_bind_xxx'가 따옴표를 포함하는 문자열 값과 같은 경우를 적절하게 처리하기 때문에 문자열 형식에 대해'sqlite_bind_xxx'를 사용해야하는 이유가 있습니다. Is는 SQL 주입 공격을 해결합니다. FTS 문제로 행운을 빌어 요. – rmaddy

관련 문제