我目前正在开发一款具有全文搜索功能的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语句没有给我任何结果。
我在执行查询之前调用sqlite3_open()并从SQLite文档中调用*“如果调用sqlite3_open()或sqlite3_open_v2()并且本机字节中的UTF-16,则数据库的默认编码为UTF-8如果使用sqlite3_open16(),请订购。“*。
我尝试将UTF8String
替换为cStringUsingEncoding:
并尝试使用不同的编码,从而尝试使用不同的编码。他们都没有工作(不是我期待他们,但至少想尝试)。
任何和所有帮助或提示都将不胜感激。
修改 我现在尝试使用SQLite数据库浏览器在数据库上运行相同的select语句,但没有得到任何结果。 这让我相信这可能与我使用FTS3创建我的Customer_Metadata表有关。
MrDresden
答案 0 :(得分: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,您就可以输入希腊语,俄语,日语,当然还有各种斯堪的纳维亚语字符。
编辑:我刚看到你的编辑。如果数据没有正确创建,那肯定是个问题。
答案 1 :(得分:0)
如果您使用的是FTS3,则默认的标记生成器将无法执行您想要的操作。
除非将特定的tokenizer指定为用于创建FTS表的CREATE VIRTUAL TABLE语句的一部分,否则将使用默认的tokenizer“simple”。简单的标记化器根据以下规则从文档或基本FTS全文查询中提取标记:
术语是符合条件的连续符号序列,其中符合条件的字符都是字母数字字符,Unicode代码点值大于或等于128的所有字符。将文档拆分为术语时,将丢弃所有其他字符。他们唯一的贡献是将相邻的术语分开。
- http://www.sqlite.org/fts3.html#tokenizer
您需要使用自定义标记生成器,或查看icu或unicode61标记生成器是否适合您。有关这些的信息都在上面链接的文档中。