Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.10.2011, 23:53
Solo7 Solo7 вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 5
Репутация: 10
По умолчанию поиск в SQLite используя LIKE

Здравствуйте!
В проекте Delphi использую SQLite, подключился, делаю выборку, перевожу строки из UTF8, все получается, но с поиском не выходит. Поиск ведется по полю, где строки вида: 100230какой-тотоварname.
Запрос такого вида:
Код:
str := Edit1.Text;
    str := StringReplace(str, ' ', '', [rfReplaceAll]);
    str := AnsiLowerCase(str);
sQuery := 'SELECT name, id, type_id FROM t_cat WHERE id in (SELECT cat_id FROM t_names WHERE search LIKE ''%'+str+'%'')';
sltb := sldb.GetTable(sQuery);
При запросе в базу цифрами или на английском код работает нормально, все выводиться, запрос на русском не работает, у меня выводиться вся база.
В интернете нашел много инфо. Советуют кодировать в UTF8 при запросе в базу. Примерно так:
Код:
sldb.GetTable := AnsiString(UTF8Decode(sldb.GetTable('SELECT name, id, type_id FROM t_cat WHERE id in (SELECT cat_id FROM t_names WHERE search LIKE ''%'+str+'%'')');
У меня пишет ошибка несочетаемые типы.
Пробывал кодировать строку перед запросом в базу
Код:
str := UTF8Decode(str);
ничего не выходит(проверял в Tmemo выводится пустая строка).
Понимаю, что для многих это легко и просто, но я недавно в Delphi и с этим не выходит разобраться.
Буду благодарен совету или ссылке, как выполнить запрос на русском.
Ответить с цитированием
  #2  
Старый 18.10.2011, 00:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Мои эксперименты показали, что все, что не на англ, работает неправильно (относительно LIKE). Соответсвенно, просто перешел на EmbeddedFB.
Ответить с цитированием
  #3  
Старый 18.10.2011, 01:00
Solo7 Solo7 вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 5
Репутация: 10
По умолчанию

lmikle,
я видел проект на delphi с поиком на русском, может конечно, там не LIKE. Но пишут же на форумах, что используя код для перевода строки в UTF8( как костыль) и им этого хватало.
Просто у меня уже мало времени для перехода на другую базу. В SQLite все написано и база и удобно(проект будет на CD).
Помогите с правильным кодом перевода строки в UTF8, возможно, что-то получится
Ответить с цитированием
  #4  
Старый 18.10.2011, 01:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, тогда, для начала, я бы смотрел на UTF8Encode. Тебе ведь надо ЗАКОДИРОВАТЬ строку в utf. Это раз. Два. А WideString не пробовал?

ЗЫ. Переход на EmbeddedFB не так сложен, как кажется. Хотя, судя по коду, ты напрямую библиотеку используешь. Я пользовался оберткой-наследником TDataSet и переход был очень простой.
Ответить с цитированием
  #5  
Старый 18.10.2011, 06:59
Solo7 Solo7 вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 5
Репутация: 10
По умолчанию

lmikle,
Использую SQLiteWrapper
Делаю так:
Код:
bdz: WideString;
bdz := UTF8Encode(str);
В базу идет русский текст.
А так
Код:
sltb := AnsiString(UTF8Encode(sldb.GetTable('SELECT name, id, type_id FROM t_cat WHERE id in (SELECT cat_id FROM t_names WHERE search LIKE ''%'+bdz+'%'')')));
Не компилиться, пишет: There is no overloaded version of 'UTF8Encode' that can be called with these arguments.
Ответить с цитированием
  #6  
Старый 18.10.2011, 07:02
Solo7 Solo7 вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 5
Репутация: 10
По умолчанию

Понимаю, что как-то не так использую UTF8Encode, подскажите где ошибка.
Ответить с цитированием
  #7  
Старый 18.10.2011, 07:29
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Можно попробовать закодировать юникод строку в Quoted Printable. И все строки хранить в таом формате.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 18.10.2011 в 07:31.
Ответить с цитированием
  #8  
Старый 18.10.2011, 09:20
Solo7 Solo7 вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 5
Репутация: 10
По умолчанию

M.A.D.M.A.N.,
напишите, пожалуйста, пример
Ответить с цитированием
  #9  
Старый 18.10.2011, 09:37
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

В общем, wchar_t переводишь в последовательность байт и каждый байт переводишь ф-ей IntToHex().
http://www.motobit.com/util/quoted-p...le-decoder.asp
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter