powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite like русских букв
32 сообщений из 32, показаны все 2 страниц
SQLite like русских букв
    #35139501
GoHo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не работает like на русских буквах
база UTF-8
поля varchar(50)
если вводить английские символы то все как положено,
если русские происходит странное, например
1 Россия
2 Румыния
3 Украина
4 Вьетнам
5 Афганистан

Усли пишем
select * from Country
where Name like 'Украина'

выведет Украину, Румынию и Вьетнам(количество символов совпадает)
Если поставить '%' то добавит Афганистан знаков больше.
Может я чего не так делаю, или это в принципе не возможно?
...
Рейтинг: 0 / 0
SQLite like русских букв
    #35142919
Alexbootch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoHoНе работает like на русских буквах
база UTF-8
поля varchar(50)
если вводить английские символы то все как положено,
если русские происходит странное, например
1 Россия
2 Румыния
3 Украина
4 Вьетнам
5 Афганистан

Усли пишем
select * from Country
where Name like 'Украина'

выведет Украину, Румынию и Вьетнам(количество символов совпадает)
Если поставить '%' то добавит Афганистан знаков больше.
Может я чего не так делаю, или это в принципе не возможно?

Все нормально должно работать. Проверял на твоем примере выдает --> Украина
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
SQLite like русских букв
    #36350673
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexbootch, в том то и дело что не работает. dll последней версии
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36350885
Alexbootch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у Вас база в кодировке UTF-8, то и искать "Украина" нужно так:

Код: plaintext
1.
2.
SELECT * FROM Country
WHERE Name LIKE 'Украина';
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36350905
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
А вы поддержку юникода включили?.. По умолчанию СУБД распознает только английский алфавит. Куча веток по соседству на эту тему, например, "Автоматическое подключение collation для русского языка в расширении ICU для SQLite".
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36350917
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG, У меня в Delphi в программе исполузуется эта http://www.sqlite.org/sqlitedll-3_6_20.zip. + класс для работы с БД. Где там collation и ICU влючать понятия не имею. Мля, всё написано, код, а как дошёл до поиска текста - беда. База в UTF8
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36350921
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexbootch,
Пример: записи в базе: 2 строки "Администрация города" "Администрация области". Запрос вида: горо. Вот так ищет улубуду, т.е. выводит обе записи:
Код: plaintext
tsql := sql.GetTable('select id from firm where name like "%' + Edit1.Text + '%"');
А так, вообще ничего:
Код: plaintext
tsql := sql.GetTable('select id from firm where name like "%' + AnsiToUtf8(Edit1.Text) + '%"');
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351046
Alexbootch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MT-TeamAlexbootch,
Пример: записи в базе: 2 строки "Администрация города" "Администрация области". Запрос вида: горо. Вот так ищет улубуду, т.е. выводит обе записи:
Код: plaintext
tsql := sql.GetTable('select id from firm where name like "%' + Edit1.Text + '%"');
А так, вообще ничего:
Код: plaintext
tsql := sql.GetTable('select id from firm where name like "%' + AnsiToUtf8(Edit1.Text) + '%"');


MT-Team , пиши строки "Администрация города" "Администрация области" в базу в кодировке UTF-8, а не ANSI, т.е. "Администрация РіРѕСЂРѕРґР°" и "Администрация области"
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351117
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexbootch, они там так и записаны (UTF8), если базу (файл) открыть в то-же Notepad++ то он как раз говорит что файл в кодировке UTF8.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351157
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MT-Team, можете мне прислать ваши БД и врапер ? Посмотрю, потестю ...
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351192
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev, да без проблем. Говорите E-Mail
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351194
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darefiev собака da тире soft точка com
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351270
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В БД все лежит в ANSI-1251, а не в UTF8. Т.е. стандартный LIKE работать не будет,
как и прочие встроенные строковые функции, операторы и т.д.

Врапер ничего, никуда не конвертирует. Т.е. тебе необходимо самому конвертировать
строки в UTF8 перед сохранением и конвертировать в ANSI 1251 при чтении. При условии,
что Delphi не юникодный.

Примерно так ...
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351485
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefievчто Delphi не юникодный.
А как проверить?
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351533
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И ещё, подскажите менеджер для SQLite какой нить хороший.
Модератор: Это оффтопик. Предлагаю создать новую тему с означенным вопросом.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351551
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MT-TeamDmitry Arefievчто Delphi не юникодный.
А как проверить?
D2007 и новее - юникодные. Но похоже присланные юниты не адаптированы к
юникодным Delphi. Так что, это не твой случай :)
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351640
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev, скачал новый врапер, то-же комманды. Там уже есть упоминания о UTF-8.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36351958
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. А как задать чтоб база создавалась в UTF?
2. Поставил Delphi 2009. Там нужно кодить/енкодить строки при вставке/выбоки?
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36352911
Amver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В D2006+(вроде-бы) кодировка по-умолчанию - utf8

На счет SELECT - попробуйте следующий трюк, (у меня в аналогичном случае) работает превосходно :)
Код: plaintext
tsql := AnsiString(UTF8Decode(sql.GetTable('select id from firm where name like "%' + Edit1.Text + '%"'));

Здесь есть другой подводный камень, как написано в исходном коде SQLite:
Код: plaintext
1.
2.
3.
** SQLite only considers US-ASCII (or EBCDIC) characters.  We do not
** handle case conversions for the UTF character set since the tables
** involved are nearly as big or bigger than SQLite itself.
*/
что значит, что LIKE и ORDER BY для кириллических символов чувствителены к регистру :(

Гуглю уже 2й день, из более-менее полезного нашел только статью http://habrahabr.ru/blogs/sql/57915/ , где предлагается установить ICU. Не имею ни малейшего понятия как для stand-alone приложения, написанного на delphi, установить этот самый ICU, поэтому в той статье меня заинтересовал предпоследний комментарий (цитирую полностью):
naum22 апреля 2009, 20:31
Достаточно пропатчить массив sqlite3UpperToLower (надо бы его расширить) + исправить где-надо range, если мне память не изменяет.
Тема модификации сурса SQLite развития не получила, гугл-же ничего интересного тоже пока не не выдал. В Си я приблизительный ноль, поэтому,потыкавшись в исходник, так и не решил проблему.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36352974
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Amverолее-менее полезного нашел только статью http://habrahabr.ru/blogs/sql/57915/ , где предлагается установить ICU. Не имею ни малейшего понятия как для stand-alone приложения, написанного на delphi, установить этот самый ICU, поэтому в той статье меня заинтересовал предпоследний комментарий (цитирую полностью):
naum22 апреля 2009, 20:31
Достаточно пропатчить массив sqlite3UpperToLower (надо бы его расширить) + исправить где-надо range, если мне память не изменяет.
Тема модификации сурса SQLite развития не получила, гугл-же ничего интересного тоже пока не не выдал. В Си я приблизительный ноль, поэтому,потыкавшись в исходник, так и не решил проблему.

В этом самом форуме я уже не раз на сборку SQLite+libICU под винду ссылку давал. На офсайте есть информация (разве что не написано, что в каком месте патчить при сборке), в рассылке эскулайт эта тема регулярно поднималась... Также я выкладывал ссылку на упрощенную реализацию, которую легко собрать и весит немного (именно расширенная таблица), в рассыле эскулайт немецкий разработчик недавно еще одну реализацию публиковал, в которой по моей просьбе предусмотрел работу с русским языком (я обещался протестировать, но пока не добрался, т.к. реализация под винду, а у меня линукс на всех доступных машинах). Далее, можно забиндить collation из приложения... Сколько вам еще нужно решений, если 4-х перечисленных мало?
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36353042
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MT-Team1. А как задать чтоб база создавалась в UTF?
Читай
MT-Team2. Поставил Delphi 2009. Там нужно кодить/енкодить строки при вставке/выбоки?
Да кто же ее эту либу, которую ты используешь, знает ...
Выбери нормальную либу. Вот список - http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36353218
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievВыбери нормальную либу. Вот список - http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
Я как раз либу вот из этого списка и выбрал. Короч, всем спасибо, разобрался. При вставке в таблицу использую UTF8Encode а при выводе использую UTF8Decode. Всё работает замечательно, только вот и огорчает что поиск регистрозависимый.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36353222
MT-Team
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmverНа счет SELECT - попробуйте следующий трюк, (у меня в аналогичном случае) работает превосходно :)
Я как раз вчера до этого допёр. То-же всё работает превосходно. Отписался выше.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36354132
Amver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBGВ этом самом форуме я уже не раз на сборку SQLite+libICU под винду ссылку давал.С SQLite я работаю через компоненты Aducom. Качал вашу сборку http://mobigroup.ru/files/sqlite3.6.2-win.tar.bz2 , ни в одной из dll в данном архиве нету ф-ции SQLite3Open16, которая требуется компоненту для работы.
Далее, натыкался я и на фикс sqlite сурсов в рассылке, вот только он датируется 2006 годом, посему применить его не является возможным: http://www.mail-archive.com/sqlite-users@sqlite.org/msg12261.html

Не кинетесь-ли линком на реализацию немецкого разработчика?

Поскольку пока-что мною проблема "решена" в лоб, путем дублирования данных в БД в низком регистре.
...
Рейтинг: 0 / 0
SQLite like русских букв
    #36355543
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
AmverMBGВ этом самом форуме я уже не раз на сборку SQLite+libICU под винду ссылку давал.С SQLite я работаю через компоненты Aducom. Качал вашу сборку http://mobigroup.ru/files/sqlite3.6.2-win.tar.bz2 , ни в одной из dll в данном архиве нету ф-ции SQLite3Open16, которая требуется компоненту для работы.

В эскулайте такой функции нет, там даже другие правила именования функций. Это функция враппера. Если честно, не понимаю, а зачем враппер нужен, тем более, такой экзотический? SQLтем и хорош, что из любого языка с ним удобно работать.

Amver
Не кинетесь-ли линком на реализацию немецкого разработчика?

Поскольку пока-что мною проблема "решена" в лоб, путем дублирования данных в БД в низком регистре.

Есть где-то в архивах рассылки, но искать не стал, выложил ту версию, что Jean-Christophe Deschamps мне присылал:
http://mobigroup.ru/files/sqlite-ext/unifuzz.zip

А вот кусок из письма:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Hi Alexey,

 
 I would like to have your opinion for an extension I've [re]written implementing Unicode casing, fuzzy compare 
and collation.  I've choosen to make it locale-independant, whatever that means, short of a detailed explanation 
see header of source for all details).

 I was aiming at a lightweight implementation, not the  18 +Mb of ICU, at the cost of cutting "some" corners.

 I couldn't come up with a lightweight and portable collation support, so this implementation relies on a _Windoze_ 
call.  Any XP or later will do.

...

Дальше он пишет, что надеется, я все-таки найду где-нибудь винду, чтобы потестить, и расскажу о результатах. Найду, конечно, вот только когда...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
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
32 сообщений из 32, показаны все 2 страниц
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite like русских букв
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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