我有一个带有西里尔行的SQLite数据库。 例如:
CREATE TABLE customer (
id INTEGER PRIMARY KEY,
name TEXT,
surname TEXT
);
假设其中两行是这样的:
"153 | Иван | Попов"
"243 | Ivan | Popov"
它实际上是用俄语和英语写的同名和姓氏。
我在程序中使用c ++和Qt。我想在名称或姓氏列中选择包含特定字符串的行。
由于我使用QSqlTableModel
,我只使用SQL查询过滤器(只是SQL查询的WHERE
部分):
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);
}
当我将过滤器设置为'ivan'时,它显示正确的行(ID为243)。但是,当我试图用'иван'做同样的事情时它没有显示,而'Иван','ван'等显示正确的条目。看起来这个查询只适用于西里尔字母区分大小写的匹配,而拉丁字母则完全正常。
我知道ICU已启用它。它有效:
$ sqlite3
$ SELECT 'Иван' like 'иван';
1
因此,当我使用西里尔字母时,我仍然无法理解为什么我的程序中的查询区分大小写?它是否与Qt中的SQL查询实现有某种关系?
答案 0 :(得分:1)
默认情况下,SQLite仅支持ASCII字符的大小写不敏感。如果您需要支持Unicode大小写,则必须define your own UPPER
/LOWER
functions和collation。