powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite like русских букв
7 сообщений из 32, страница 2 из 2
Период между сообщениями больше года.
SQLite like русских букв
    #37150578
ujinsw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Искал решение проблемы русских, а точнее не английских символов, при поиске с использованием LIKE, и нашел только такое решение для VB.NET - Переопределение функции upper или lower. Причем этим подходом можно решить и другие проблемы, например отсутствие полезной функции NOW() в запросах. Вот пример кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Imports System.Data.SQLite

<SQLiteFunction(Name:="lower", Arguments:=1, FuncType:=FunctionType.Scalar)> _
Public Class LCase : Inherits SQLiteFunction
Public Overrides Function Invoke(ByVal args() As Object) As Object
If (args.Length = 0) OrElse (args(0) Is Nothing) Then Return Nothing
Return TryCast(args(0), String).ToLower
End Function
End Class
а тут можно прочитать более подробно http://sargaev.ru/?p=137
там же можно скачать и исходники
...
Рейтинг: 0 / 0
SQLite like русских букв
    #37151540
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
ujinsw,

Не стоило бы публиковать на форуме ссылку на статью, автор коей даже не удосужился открыть документацию - кто-то ведь может поверить написанному. Итак, текущая дата и время вместо now() извлекается так:

Код: plaintext
1.
2.
3.
4.
5.
sqlite> select datetime('now');
 2011 - 03 - 05   17 : 47 : 17 

sqlite> select strftime('%Y-%m-%d %H:%M:%S', 'now');
 2011 - 03 - 05   17 : 47 : 17 

Если "стандартный" формат устраивает, то достаточно функции datetime(), а для вывода в произвольном формате используется strftime().

Что же касается юникодного регистро-независимого поиска, все подробно разобрано выше в этой теме. Разве что, могу рассказать для интересующихся - причина, по которой таблицы сравнения символов не добавлены в эскулайт, весьма проста - размер таблиц символов превышает размер самого эскулайт, так что это просто нецелесообразно, а вместо этого рекомендуется использовать одно из расширений (ICU, например) или биндить функции сравнения ОС (вот с этим стоит быть поосторожнее - юникод не так прост, и можно словить баги с отсутствием нормализации, в частности).
...
Рейтинг: 0 / 0
SQLite like русских букв
    #37151667
Alexbootch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGujinsw,

Не стоило бы публиковать на форуме ссылку на статью, автор коей даже не удосужился открыть документацию - кто-то ведь может поверить написанному. Итак, текущая дата и время вместо now() извлекается так:

Код: plaintext
1.
2.
3.
4.
5.
sqlite> select datetime('now');
 2011 - 03 - 05   17 : 47 : 17 

sqlite> select strftime('%Y-%m-%d %H:%M:%S', 'now');
 2011 - 03 - 05   17 : 47 : 17 


MBG, забыли уточнить, что:

Код: plaintext
1.
2.
3.
SELECT datetime('now');

SELECT strftime('%Y-%m-%d %H:%M:%S', 'now');

это текущая дата и время в формате UTC (Universal Time Coordinated), которое отличается от текущей даты и времени на компьютере. Для получения текущей или локальной дата и времени нужно в запрос добавить 'localtime':

Код: plaintext
1.
2.
3.
SELECT datetime('now', 'localtime');

SELECT strftime('%d.%m.%Y %H:%M:%S', 'now', 'localtime');
...
Рейтинг: 0 / 0
SQLite like русских букв
    #37486879
Solo7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с подобной задачей.
Проект в Delphi 2010, использую SQLite и SQLiteWrapper.
Все прекрасно выводится, при выводе из таблиц перевожу строку:
Код: plaintext
UTF8Decode(k)
Но поиск работает только с цифрами и с английскими буквами, русский никак не хочет.
Вот такой запрос у меня ищет цифры и английские буквы:
Код: plaintext
1.
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);

При поиски перевожу строку к нижнему регистру, делал как в этой ветке:
Код: plaintext
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 ''%'+str+'%'')')));
Но пишет ошибка.
Подскажите, как сделать русский поиск.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #37503243
Solo7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодаря помощи Dmitry Arefiev все решилось очень просто.
В моем случае была ошибка, я делал так:
Код: plaintext
1.
 var 
sQuery: WideString;

надо было
Код: plaintext
sQuery: AnsiString;
Вот код, подкоректированный Dmitry Arefiev, который у меня заработал:
Код: plaintext
1.
2.
3.
4.
5.
 var 
sQuery: AnsiString;
...
 sQuery := UTF8Encode('SELECT name, id FROM t_cat WHERE id in (SELECT cat_id FROM t_names WHERE search LIKE ''%'+str+'%'')');

...
Рейтинг: 0 / 0
SQLite like русских букв
    #37546640
Myasnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

занятно
...
Рейтинг: 0 / 0
SQLite like русских букв
    #37554281
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Solo7
Вот код, подкоректированный Dmitry Arefiev, который у меня заработал:
Код: plaintext
1.
2.
3.
4.
5.
 var 
sQuery: AnsiString;
...
 sQuery := UTF8Encode('SELECT name, id FROM t_cat WHERE id in (SELECT cat_id FROM t_names WHERE search LIKE ''%'+str+'%'')');



У вас лайк по id (я подозреваю, что это целоцисленные значения). Когда придумают строчные и прописные цифры, придётся переписывать :)

вот тут я описал, видимо, работающий солюшен http://www.sql.ru/forum/actualthread.aspx?tid=891589
(сам не осилил)
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite like русских букв
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]