|
SQLite и поиск на русском языке (UTF-8)
|
|||
---|---|---|---|
#18+
Создал базу с английскими строками, с перемешанными регистрами символов: 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? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2007, 12:46 |
|
SQLite и поиск на русском языке (UTF-8)
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2007, 13:50 |
|
SQLite и поиск на русском языке (UTF-8)
|
|||
---|---|---|---|
#18+
Вообще-то C# :) Если использовать в базе однобайтные ANSI-символы - будет поиск корректно работать? Я читал, что вроде все безрегистровые поиски заточены только на латиницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2007, 14:51 |
|
SQLite и поиск на русском языке (UTF-8)
|
|||
---|---|---|---|
#18+
Помогите! Делаю приложение для 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2009, 19:29 |
|
SQLite и поиск на русском языке (UTF-8)
|
|||
---|---|---|---|
#18+
На ошибку в коде с именем str не смотрите там везде wstring и wstr в качестве переменной, при выдирании из проекта забыл подправить. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2009, 19:36 |
|
SQLite и поиск на русском языке (UTF-8)
|
|||
---|---|---|---|
#18+
У меня такая функция получилась, работает на текстовых полях Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2010, 12:56 |
|
|
start [/forum/search_topic.php?author=Esachello&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 392ms |
total: | 580ms |
0 / 0 |