Есть такая СУБД SQLite. Всем она хороша, но имеет некоторые недостатки. Один из них это не полная поддержка utf кодировок. То есть такие внутренние функции как like, upper, lower будут правильно работать только для англоязычной части страницы ASCII. На этой теме уже сломано не мало копий и исписано страниц форумов.

 

Можно конечно использовать ICU(International Components for Unicode). Но тогда придется вместе с программой таскать некоторое количество мегабайтов. Но это не всех устраивает. Но есть и более простой способ. Это использование  sqlite3_create_functionто есть когда вы создаете свою функцию и используете её sql запросах к базе. 

Я это сделал для компонентов доступа к базам данных Unidac.

Там этот момент использования sqlite3_create_function  в некотором роде упрощен. 

Привожу пример для аналога функции like

В общем добавляем в раздел

uses

,LiteClassesUni, LiteCallUni, System.Variants;

Затем  пишем такую функцию

function ilike(InValues: array of Variant): Variant;
var
  inst1: WideString;
  inst2: WideString;
begin
  inst1 :=AnsiLowerCase(vartostr(InValues[0]));
  inst2 := AnsiLowerCase(vartostr(InValues[1]));
  if AnsiPos(inst1, inst2) > 0 then
    result := Variant(True)
  else
    result :=Variant(False);
end;

 Если знаете как упросить её пиши в комментариях.

А затем в коде после подключения к базе регистрируем данную функцию

uniconnection1.Open;
// регистрируем свою функцию
   TLiteUtils.RegisterFunction(SqliteCon, 'ilike', 2, ilike);

 

И не забываем уничтожить её перед выходом из программы.

 TLiteUtils.UnRegisterFunction(SqliteCon, 'ilike', 2);
 uniconnection1.close;

 Ну а в коде SQL запросов пишем уже 

select kid,kname from table where ilike('текст',kname);

 Я не стал усложнять функцию для использования её с символами % или _ , кому требуется тот может это сам дописать. И добавить свои требуемые функции.

Комментарии   

0 #3 push up bra cheap 13.06.2017 15:59
It's perfect time to make a few plans for the future and it is time
to be happy. I have read this put push up bra cheap: http://pooka732.typepad.com/blog/2011/09/the-worlds-first-backless-strapless-bra-for-large-breasts.html and if
I may just I desire to suggest you some attention-grabb ing issues or suggestions.
Maybe you can write subsequent articles referring to this article.

I want to read even more things about it!
Цитировать
0 #2 Андрей 18.09.2015 00:54
Тоже всегда регистрирую свою функцию сравнения. И тогда можно реализовать любой вид поиска, хоть регэкспы, хоть маски *?.
Ну, а раз с русским всё плохо - тогда и строки храним не в UTF8, а в простом ANSI - что уменьшает размер базы в два раза. Тобишь избавление от ущербной стандартной LIKE - даёт только кучу выгрышей...
Цитировать
0 #1 Виталий 27.05.2014 08:09
Как вариант:

function ilike(InValues: array of Variant): Variant;
var
inst1: WideString;
inst2: WideString;
begin
inst1 := VarToStr(InValu es[0]);
inst2 := VarToStr(InValu es[1]);

Result := Variant(AnsiCon tainsText(inst2 , inst1));
end;
Цитировать

Добавить комментарий


Защитный код
Обновить