Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / [SQLite] Регистронезависимый поиск / 8 сообщений из 8, страница 1 из 1
29.10.2007, 02:34
    #34900346
not_dev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
Есть БД SQLite 3, используемая кодировка 1251 ANSI Кирилица. Подключается из-под Delphi (версия библиотеки sqlite*.dll 3.4.2, допустим, используется через ASGSQLite, хотя это не важно).

Как можно организовать регистронезависимый поиск (LIKE)?
...
Рейтинг: 0 / 0
29.10.2007, 05:36
    #34900368
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
Примерно так :
lower (Field_Name) like ' здесь все маленькими '
или
upper (Field_Name) like ' ЗДЕСЬ ВСЕ БОЛЬШИМИ '
В SQLite функции преобразования в нижний и верхний регистры могут иметь другие наименования!
...
Рейтинг: 0 / 0
01.11.2007, 09:40
    #34909275
not_dev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
Не смотря на то, что используется именно ANSI, а не UTF-8, функции UPPER и LOWER некорректно работают с русским текстом.
...
Рейтинг: 0 / 0
01.11.2007, 13:55
    #34910292
not_dev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
Написал свою замену built-in UPPER'у. Выглядит следующим образом:

Вот так вот внедрена новая функция в обертку.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
...

procedure mUpper(context: Pointer; nArg: Integer; args: PPChar); cdecl;
var
  Buf: PAnsiChar;
  Size: Integer;
begin
  Buf := StrNew(_sqlite3_value_text(args^));
  Size := StrLen(p);
  CharUpperBuff(Buf, Size);
  // на этом этапе отладка показывает что upper выполнен успешно
  _sqlite3_result_text(context, Buf, Size,  0 );
end;

...

// открытие БД
begin
  ...
  _sqlite3_create_function(DBHandle, 'MUPPER',  1 , SQLITE_ANY, nil, @mUpper, nil, nil);
  ...
end;

...

Вот так вот мы ее потом используем для простейшей выборки:
Код: plaintext
1.
2.
3.
4.
SELECT Info.*
FROM Info
WHERE (MUPPER(Info.Name) LIKE '%ИНФ%')
ORDER BY Info.Priority DESC, Info.Name',

Результат выборки должен представлять собой строки с регистронезависимыми вложениями 'инф' в колонке Name. Но получаем полную неразбериху. Выдает чуть ли не всю таблицу.

Ей богу не знаю как быть и что делать. Есть у кого мысли толковые?
...
Рейтинг: 0 / 0
11.11.2007, 16:54
    #34930778
Базанович
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
not_dev
Как можно организовать регистронезависимый поиск (LIKE)?

Самый простой способ - записывать данные в базу в своей кодировке (например, а- r&, А - R&) и будет у тебя возможность делать запросы без использования upper и lower , еще и для не особо продвинутых узеров будет возможность ограничить копирование данных напрямую из базы, т.к. что бы использовать данные из базы в своих программах нужно будет знать кодировку, используемую при записи данных в базу.
...
Рейтинг: 0 / 0
28.11.2007, 16:28
    #34972465
not_dev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
БазановичСамый простой способ - записывать данные в базу в своей кодировке (например, а- r&, А - R&) и будет у тебя возможность делать запросы без использования upper и lower , еще и для не особо продвинутых узеров будет возможность ограничить копирование данных напрямую из базы, т.к. что бы использовать данные из базы в своих программах нужно будет знать кодировку, используемую при записи данных в базу.

Вполне вариант, прорабатывал его. Есть единственный момент, что проблематично сделать грамотную кодировку в плане: скорости / компактности. Русский алфавит - 33 символа, сделать 1-в-1 замену на eng нереально, следовательно ряд букв (или сразу все) необходимо кодировать двумя байтами. Получаем прирост в размере БД порядка 80%. Остальные символы использовать нельзя, т.к. все они спокойно могут встречаться в базе.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
09.09.2009, 09:22
    #36185472
ale-sumkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
not_dev,
что то ругается в функции sqlite3_create_function на @mUpper.

datamodule.pas(235,88) Error: Incompatible type for arg no. 6: Got "<address of local procedure(Pointer, LongInt, PPChar);CDecl>", expected "<procedure variable type of procedure(Pointer, LongInt, PPsqlite3_value);CDecl>"
можешь подсказать что нужно сделать
...
Рейтинг: 0 / 0
09.09.2009, 16:38
    #36186835
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SQLite] Регистронезависимый поиск
Что мешает включить в эскулайте поддержку юникода и не извращаться? Есть несколько модулей, предоставляющих эту самую поддержку. Есть нужна универсальность и куча языков, см. ICU, если нужна скорость и только базовый юникод (для русского языка подходит, если акценты удалить), см. здесь
http://mobigroup.ru/page/debian
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / [SQLite] Регистронезависимый поиск / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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