如何在保留斯堪的纳维亚字母的同时正确编码sqlite



我当前正在开发一个将具有FullText搜索的iOS应用程序。搜索是通过在SQLite数据库上执行选择语句执行的,但是问题在于,数据库中的许多值都包含斯堪的纳维亚字母(æ,Ö,Ö,á等),并且我在转换语句而没有获得HEAX值时遇到了麻烦对于字母。

这是我目前正在做的:

 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是一个常数,其中包含我要选择的列,并且搜索串包含用户输入。

这就像普通拉丁字母的魅力一样,但是例如,如果我沿Ö进行,作为搜索串,我会得到st xc3 xb6。我知道,简单地登录UTF8编码的字符串不会给出字符串的正确表示,但是问题是我的选择语句没有给我任何结果。

在执行查询之前,我正在调用sqlite3_open()和从sqlite文档 * *"如果sqlite3_open()或sqlite3_open_v2(),数据库的默认编码将为UTF-8订购如果使用sqlite3_open16()。"*。

我尝试通过用cStringUsingEncoding:替换UTF8String并尝试不同的编码来使用不同的编码。它们都没有工作(不是我期待它们,而是至少想尝试)。

所有帮助或提示都将不胜感激。

编辑现在,我尝试使用SQLITE数据库浏览器在数据库上运行相同的选择语句,并且没有得到任何结果。这使我相信,这可能与我使用FTS3创建我的Customer_Metadata表有关。

mrdresden

如果您使用的是fts3,则默认令牌将不会做您想要的。

除非将特定的令牌指定为用于创建fts表的创建虚拟表语句的一部分,否则使用了默认令牌"简单"。根据以下规则,简单的令牌提取物从文档或基本fts全文查询中提取令牌:

一个术语是合格字符的连续序列,其中合格的字符都是字母数字字符,并且所有具有Unicode Codepoint值的字符大于或等于128。将文档分为术语时,所有其他字符都被丢弃。他们唯一的贡献是分开相邻的术语。

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

您需要使用自定义令牌,或者查看ICU或Unicode61令牌是否适合您。有关这些信息的信息在上面的链接文档中。

写下您的查询:

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];

准备语句后,绑定搜索串:

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

只要数据库是UTF-8,您就可以使用希腊语,俄语,日语以及使用各种斯堪的纳维亚字符输入文本。

编辑:我刚刚看到了您的编辑。如果数据未正确创建,那肯定是一个问题。

最新更新