Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск строки без учета регистра sqlite 
:(
    Опции темы
snakesoft
Дата 16.6.2013, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Здравствуйте, уважаемые форумчане! Разбираюсь с SQL в Delphi. Набросал простенькую таблицу с двумя параметрами: ФИО и номер телефона.Возник следующий вопрос: при попытке поиска по параметру "фио" обнаружил, что поиск чувствителен к регистру (в плане кириллицы, для латиницы подобной ситуации нет). В качестве конкретного примера интересует найти фамилию Петров/Сидоров по запросу "си" или "пе". На данный момент мне это не удается. Помогите пожалуйста разобраться. Исходный код прилагается. Спасибо.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  my_sql_test.zip 239,68 Kb
PM MAIL   Вверх
Vas
Дата 17.6.2013, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Переводи значение строки таблицы в верхний/нижний регистр и строку поиска соответственно.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
snakesoft
Дата 18.6.2013, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(Vas @ 17.6.2013,  07:02)
Переводи значение строки таблицы в верхний/нижний регистр и строку поиска соответственно.

Vas, посмотрите пожалуйста исходник.
Скажите, как в процедуре Find в запросе 
Код
 sql_tb:=sql.GetTable('SELECT fio,tel FROM users WHERE fio LIKE "%'+Utf8Encode(LowerCase(find_edit.Text))+'%"'); 

указать нижний регистр для значения ФИО в БД? в строке поиска понятно как ...
PM MAIL   Вверх
Vas
Дата 18.6.2013, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(snakesoft @  18.6.2013,  01:14 Найти цитируемый пост)
указать нижний регистр для значения ФИО в БД?

Цитата

lower(X)    The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. The default built-in lower() function works for ASCII characters only. To do case conversions on non-ASCII characters, load the ICU extension. 

Функции sqllite http://www.sqlite.org/lang_corefunc.html

Должно получиться что-то типа такого
Код

 sql_tb:=sql.GetTable('SELECT fio,tel FROM users WHERE lower(fio) LIKE "%'+Utf8Encode(LowerCase(find_edit.Text))+'%"'); 


Это сообщение отредактировал(а) Vas - 18.6.2013, 07:02


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
snakesoft
Дата 18.6.2013, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(Vas @ 18.6.2013,  07:00)
Цитата(snakesoft @  18.6.2013,  01:14 Найти цитируемый пост)
указать нижний регистр для значения ФИО в БД?

Цитата

lower(X)    The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. The default built-in lower() function works for ASCII characters only. To do case conversions on non-ASCII characters, load the ICU extension. 

Функции sqllite http://www.sqlite.org/lang_corefunc.html

Должно получиться что-то типа такого
Код

 sql_tb:=sql.GetTable('SELECT fio,tel FROM users WHERE lower(fio) LIKE "%'+Utf8Encode(LowerCase(find_edit.Text))+'%"'); 

не работает ...
PM MAIL   Вверх
MetalFan
Дата 18.6.2013, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: нет
Всего: 128



Цитата(snakesoft @  18.6.2013,  09:19 Найти цитируемый пост)
Utf8Encode(LowerCase(find_edit.Text))

А utf8encode зачем? и какая версия делфи используется?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Vas
Дата 18.6.2013, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



А просто запрос что возвращает?

Код

SELECT lower(fio), tel FROM users


Ну и кодировку БД смотрите, lower работает только для ASCII.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
MetalFan
Дата 18.6.2013, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: нет
Всего: 128



Цитата(Vas @  18.6.2013,  09:29 Найти цитируемый пост)
lower работает только для ASCII

но можно подключить какой-то плагин ICU...
Цитата

The default built-in lower() function works for ASCII characters only. To do case conversions on non-ASCII characters, load the ICU extension. 



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
DYUMON
Дата 18.6.2013, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: 2
Всего: 3



на хабре есть статья как боротся с этим в sqlite при помощи delphi.


--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
snakesoft
Дата 18.6.2013, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(MetalFan @ 18.6.2013,  09:28)
Цитата(snakesoft @  18.6.2013,  09:19 Найти цитируемый пост)
Utf8Encode(LowerCase(find_edit.Text))

А utf8encode зачем? и какая версия делфи используется?

Delphi 7 использую. Насколько я понял Sqlite поддерживает только UTF, или это не так?
PM MAIL   Вверх
MetalFan
Дата 18.6.2013, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: нет
Всего: 128



snakesoft, тогда вопрос про utf8encode снят)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
snakesoft
Дата 18.6.2013, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Пробовал экспериментировать с sqlite3_create_collation
тоже не выходит ...
какие еще варианты есть?

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  my_sql_test_modify.zip 249,47 Kb
PM MAIL   Вверх
MetalFan
Дата 19.6.2013, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: нет
Всего: 128



Может еще сюда копнуть:
Цитата

The LIKE operator can be made case sensitive using the case_sensitive_like pragma.

Хотя там наверное case sensitive опять же только для ascii

Еще можно попробовать перекрыть функцию like своей, с помощью sqlite3_create_function()

Это сообщение отредактировал(а) MetalFan - 19.6.2013, 08:35


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
snakesoft
Дата 19.6.2013, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(MetalFan @ 19.6.2013,  08:34)
Может еще сюда копнуть:
Цитата

The LIKE operator can be made case sensitive using the case_sensitive_like pragma.

Хотя там наверное case sensitive опять же только для ascii

Еще можно попробовать перекрыть функцию like своей, с помощью sqlite3_create_function()

Попробовал с sql_create_function, выдает ошибку на строке
Код
 sVal := PAnsiChar(SQLite3_value_text(args^)); 


Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  my_sql_test_.zip 248,86 Kb
PM MAIL   Вверх
DYUMON
Дата 19.6.2013, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: 2
Всего: 3



вот статья почитай 
http://habrahabr.ru/post/150543/


--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
snakesoft
Дата 21.6.2013, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(DYUMON @ 19.6.2013,  12:24)
вот статья почитай 
http://habrahabr.ru/post/150543/

А какие параметры нужно указать в RU_CollationCompare?

Код
sqlite3_create_collation(Fdb, 'RU', SQLITE_UTF8, nil, RU_CollationCompare);

PM MAIL   Вверх
DYUMON
Дата 21.6.2013, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 17.6.2006
Где: Новосибирск

Репутация: 2
Всего: 3



эта функция такая 
Код

function RU_CollationCompare(UserData: pointer; l1: integer; p1: pointer; l2: integer; p2: pointer): integer; cdecl;
begin
  result := CompareUTF8IgnoreCase(L1, P1, L2, P2);
end;




--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
snakesoft
Дата 25.6.2013, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(DYUMON @ 21.6.2013,  13:35)
эта функция такая 
Код

function RU_CollationCompare(UserData: pointer; l1: integer; p1: pointer; l2: integer; p2: pointer): integer; cdecl;
begin
  result := CompareUTF8IgnoreCase(L1, P1, L2, P2);
end;


Попробовал с RU_CollationCompare - результат тот же. Не могу понять, что я неправильно делаю...

Добавлено через 7 минут и 6 секунд
Пробовал еще с

Код

function UnicodeCompare(UserData: Pointer; P1Size: Integer;
  P1: PWideChar; P2Size: Integer; P2: PWideChar): Integer; cdecl;
begin
  Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE,
    P1, P1Size div SizeOf(WideChar), P2, P2Size div SizeOf(WideChar)) - CSTR_EQUAL;
end;

sqlite3_create_collation(FDB, 'RU', 1, nil, @UnicodeCompare);
 

безрезультатно

Код
 sqlite3_create_collation(FDB, 'RU', 1, nil, @RU_CollationCompare); 
 тоже безрезультатно

а если так

Код
 sqlite3_create_collation(FDB, 'RU', 1, nil, RU_CollationCompare); 
 требует указать параметры, передаваемые RU_CollationCompare.




Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  my_sql_test.zip 250,65 Kb
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0972 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.