Есть такая СУБД 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 #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;
Цитировать
Добавить комментарий