Поиск строки без учета регистра sqlite
Возник следующий вопрос: при попытке поиска по параметру "фио" обнаружил, что поиск чувствителен к регистру (в плане кириллицы, для латиницы подобной ситуации нет). В качестве конкретного примера интересует найти фамилию Петров/Сидоров по запросу "си" или "пе".
На данный момент мне это не удается. Помогите пожалуйста разобраться.
Исходный код прилагается. Спасибо.
Баг SQLite. Не знаю, пофиксили ли её. Попробуй выключить эту прагму PRAGMA case_sensitive_like, она должна сделать все сравнения с помощью LIKE нечувствительными к регистру, но может и не сработать.
А вообще, лучше все вещи хранить в базе в одном регистре, в нижнем, например, а уже при выводе в форму менять его.
Либо, касательно SQLite, можно использовать функцию lower(), но это замедлит поиск.
Алсо, если будешь юзать lower(), она будет работать только для ASCII символов по дефолту, для всего, что вне ASCII, надо подключить ICU экстеншон.
Да чего я тебе всё это рассказываю? Ты и сам можешь это прочесть в документации к СУБД,
или каким-либо другим образом?
Первая и вторая статьи тоже обязательны к прочтению.
begin
result := CompareUTF8IgnoreCase(L1, P1, L2, P2);
end;
P1: PWideChar; P2Size: Integer; P2: PWideChar): Integer; cdecl;
begin
Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE,
P1, P1Size div SizeOf(WideChar), P2, P2Size div SizeOf(WideChar)) - CSTR_EQUAL;
end;
sqlite3_create_collation(FDB, 'RU', 1, nil, @UnicodeCompare);
так тоже не выходит
Я бы сделал так:
begin
Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, lpStr1, Length(lpStr1), lpStr2, Length(lpStr2));
end;
Обратите внимание на использование Length. Это накладывает некоторые ограничения на функцию, но с практической точки зрения я думаю мало вероятно встретить фамилию из 65536 символов.
Я бы сделал так:
begin
Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, lpStr1, Length(lpStr1), lpStr2, Length(lpStr2));
end;
Обратите внимание на использование Length. Это накладывает некоторые ограничения на функцию, но с практической точки зрения я думаю мало вероятно встретить фамилию из 65536 символов.
Попробовал так, как ты написал... Все равно не находит Сидорова через "си"
Вот фрагмент где вы считываете фамилию, обрезаете её длину до длины поискового слова и потом пытаетесь применить функцию.
Я думаю понятно что при разных длинах слова не равны?
Вот фрагмент где вы считываете фамилию, обрезаете её длину до длины поискового слова и потом пытаетесь применить функцию.
Я думаю понятно что при разных длинах слова не равны?
Код в приложении к моему предыдущему посту.
Не совсем понимаю где "считываю фамилию" вот основной запрос
Результат по поиску - тот же.