5

我目前正在开发一个具有全文搜索功能的 IOS 应用程序。搜索是通过在 sqlite 数据库上执行 select 语句来执行的,但问题是数据库中的许多值都包含斯堪的纳维亚字母(Æ、Ö、Á 等),并且我在转换语句时遇到了麻烦而没有获得十六进制值对于字母。

这是我目前正在做的事情:

 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 语句没有给我任何结果。

我在执行查询之前和 SQLite 文档中调用 sqlite3_open() *“如果调用 sqlite3_open() 或 sqlite3_open_v2(),则数据库的默认编码将是 UTF-8,如果 sqlite3_open16,则以本机字节顺序使用 UTF-16 () 用来。”*。

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

任何和所有帮助或提示,将不胜感激。

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

德累斯顿先生

4

2 回答 2

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:

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

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

编辑:我刚刚看到你的编辑。如果数据没有正确创建,那肯定是个问题。

于 2012-10-31T16:33:18.157 回答
0

如果您使用的是 FTS3,则默认标记器不会做您想做的事情。

除非将特定标记器指定为用于创建 FTS 表的 CREATE VIRTUAL TABLE 语句的一部分,否则将使用默认标记器“simple”。简单标记器根据以下规则从文档或基本 FTS 全文查询中提取标记:

术语是符合条件的字符的连续序列,其中符合条件的字符都是字母数字字符和 Unicode 代码点值大于或等于 128 的所有字符。在将文档拆分为术语时,所有其他字符都将被丢弃。他们唯一的贡献是分离相邻的术语。

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

您需要使用自定义标记器,或者查看 icu 或 unicode61 标记器是否适合您。有关这些的信息在上面的链接文档中。

于 2012-10-31T16:49:21.473 回答