powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite и поиск на русском языке (UTF-8)
6 сообщений из 6, страница 1 из 1
SQLite и поиск на русском языке (UTF-8)
    #34703783
hinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал базу с английскими строками, с перемешанными регистрами символов:
cmd.CommandText = "CREATE TABLE TestCase (ID integer, namez nvarchar(30))";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO TestCase VALUES (0, 'Abcd')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO TestCase VALUES (1, 'aBcd')";
....etc

Поиск в базе работает превосходно, SQLite может найти все возможные записи (ABCd, Abcd, abcd, ...):
SELECT * FROM mybase WHERE field1 LIKE '%ABC%'

Но когда заполняю базу русскими буквами - поиск 'АБВ' может найти только записи содержащие точную копию 'АБВ', но никак не 'абв'

Используется кодировка UTF-8, если необходимо, могу перейти на другую. В моей реальной базе используется кириллица вперемешку с латиницей.
Каким образом эту проблему решают глубокоуважаемые пользователи SQLite?
...
Рейтинг: 0 / 0
SQLite и поиск на русском языке (UTF-8)
    #34704069
Alexbootch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hinstein Создал базу с английскими строками, с перемешанными регистрами символов:
cmd.CommandText = "CREATE TABLE TestCase (ID integer, namez nvarchar(30))";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO TestCase VALUES (0, 'Abcd')";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO TestCase VALUES (1, 'aBcd')";
....etc

Поиск в базе работает превосходно, SQLite может найти все возможные записи (ABCd, Abcd, abcd, ...):
SELECT * FROM mybase WHERE field1 LIKE '%ABC%'

Но когда заполняю базу русскими буквами - поиск 'АБВ' может найти только записи содержащие точную копию 'АБВ', но никак не 'абв'

Используется кодировка UTF-8, если необходимо, могу перейти на другую. В моей реальной базе используется кириллица вперемешку с латиницей.
Каким образом эту проблему решают глубокоуважаемые пользователи SQLite?

D. Richard Hipp LIKE оператор является чувствительным к 8- битовым iso8859 символам и символам UTF-8. Например, выражение 'a' LIKE 'A' - ИСТИНА, но '?' LIKE '?' - ЛОЖНОЕ.).


Таким образом, при выволнении запросов по поиску русского текста: 'а' LIKE 'А' - ЛОЖНОЕ,
т.е. LIKE чувствителе к регистру русских букв.

Для поиска без учета регистра надо использовать функцию upper , которая также не работает с UTF-8.

Выход: писать самому функцию upper . Если пишешь на Delphi, вот примерчик как можно реализовать функцию upper :

unit HiAsmUnit;

interface

uses kol,Share,Debug,Windows,SQLite3Api,hiSQLite_DB;

type
THiAsmClass = class(TDebug)
public
dbHandle:THI_Event;
procedure addFunction(var _Data:TData; idx:word);
end;

implementation

procedure myFunc(ctx:pointer; nArg:integer; args:ppvalue); cdecl;
var s:string;
begin
s:=sqlite3_value_text(args^);
CharUpperBuff(@s[1],Length(s));
sqlite3_result_text(ctx,PChar(s),Length(s),0);
end;

procedure THiAsmClass.addFunction;
var dt:TData;
begin
dt := ReadData(_Data,dbHandle,nil);
if _IsObject(dt,SQLite_GUID) then begin
sqlite3_create_function(ToObject(dt),PChar('UPPER'),1,SQLITE_ANY,nil,@myFunc,nil,nil);
end;
end;

end.

ЗЫ: Код написан для программы HiAsm, но думаю не составит труда перевести его на Delphi
...
Рейтинг: 0 / 0
SQLite и поиск на русском языке (UTF-8)
    #34704263
hinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то C# :)
Если использовать в базе однобайтные ANSI-символы - будет поиск корректно работать?
Я читал, что вроде все безрегистровые поиски заточены только на латиницу.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
SQLite и поиск на русском языке (UTF-8)
    #36017289
Фотография irigm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите! Делаю приложение для WinCE unicode с++ std::wstring не могу добиться чтобы LIKE работал. Пытаюсь использовать код который представлен ниже а он не работает. При дебаге myFunc нормально принимает wstr преобразует к нижнему регистру передаёт обратно в SQLite а SQLite принимает этот текст за какой-то другой и при поиске находит левые строки. И ещё с сортировкой не подскажите как быть???
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
//************************************************
std::wstring StringToLower(std::wstring myString)
{
  const int length = myString.length();
  for(int i= 0 ; i!=length; ++i)
  {
	  myString[i] = towlower(myString[i]);
  }
  return myString;
}
//************************************************
void myFunc( sqlite3_context * ctx, int argc, sqlite3_value ** argv )
{
	if( argc !=  1  ) return;
	wstring str;
	switch(sqlite3_value_type(argv[ 0 ]))
	{
		case SQLITE_NULL:
		{
			sqlite3_result_text( ctx, "NULL",  4 , SQLITE_STATIC );
			break;
		}
		case SQLITE_TEXT:
		{
			wstring wstr=static_cast<const wchar_t*>(sqlite3_value_text16(argv[ 0 ]));
			wstr=StringToLower(wstr);
			sqlite3_result_text16( ctx, str.c_str(), str.size() , SQLITE_TRANSIENT );
			break;
		}
		default:
			sqlite3_result_text( ctx, "NULL",  4 , SQLITE_STATIC );
		break;
	}
}
//************************************************
sqlite3_create_function( pDB, "LOWER",  1 , SQLITE_ANY, NULL, myFunc, NULL, NULL ) ;
...
Рейтинг: 0 / 0
SQLite и поиск на русском языке (UTF-8)
    #36017293
Фотография irigm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ошибку в коде с именем str не смотрите там везде wstring и wstr в качестве переменной, при выдирании из проекта забыл подправить.
...
Рейтинг: 0 / 0
SQLite и поиск на русском языке (UTF-8)
    #36587446
ЯИра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня такая функция получилась, работает на текстовых полях
Код: plaintext
1.
2.
3.
void MyFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
	sqlite3_result_text16(context, _wcsupr((TCHAR*)sqlite3_value_text16(argv[ 0 ])),- 1 ,SQLITE_TRANSIENT);
}
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite и поиск на русском языке (UTF-8)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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