2013-04-30 3 views
3

На самом деле вопрос задавали несколько раз, но мне не удалось найти ответ.Функция SQLite upper() для международных символов

Существует набор таблиц SQLite, которые доступны только для чтения - я не могу изменить их структуру или переопределить правила сортировки. Таблицы, содержащие несколько международных символов (русский/китайский и т. Д.).

Я хотел бы получить некоторые регистронезависимый выбор как:

select name from names_table where upper(name) glob "*"+constraint.toUpperCase()+"*" 

Он работает только тогда, когда name является латинским/ASCII кодировки для международных символов он не работает.

руководства SQLite читает:

Функция верхней (X) возвращает копию входной строки X, в котором все строчных символы ASCII преобразуется в их прописной эквивалентном.

Итак, вопрос в том, как решить эту проблему и сделать международные символы в верхнем/нижнем регистре?

ответ

5

Это известно проблема в SQLite. Вы можете переопределить встроенные функции через Android NDK. Это не простой способ. Посмотрите на this question

Обратите внимание, что индексы ваших таблиц не будут работать (для UDF), и запрос может быть очень медленным.

Вместо этого вы можете хранить свои данные (которые вы ищете) в другом столбце в формате ascii.

Например:

"insert into names_table (name, name_ind) values ('"+name+"',"+"'"+toAsciiEquivalent(name)+"')" 

name name_ind 
---------------- 
Имя  imya 
Name name 
ыыы  yyy 

и строка поиска по столбцам name_ind

select name from names_table where name_ind glob "*"+toAsciiEquivalent(constraint)+"*" 

Это решение требует больше места для данных, но это просто и быстро.

+0

Мои таблицы доступны только для чтения - я не могу изменить их структуру. – barmaley

+0

Вы можете использовать другую базу данных с необходимыми таблицами и столбцами и прикрепить эту БД к исходной. Однако в этом случае процесс синхронизации будет более сложным. – matreshkin

+0

@matreshkin Привет! Не могли бы вы быть более конкретными для реализации метода AsciiEquivalent()? Может быть, пример кода? Также я прав, что он также может использоваться с инструкцией LIKE? – AlexKost

1

Вместо предоставления полной поддержки в случае использования кода Unicode по умолчанию SQLite обеспечивает возможность связывания с внешними программами сравнения и преобразования Unicode. Приложение может перегружать встроенную последовательность сортировки NOCASE (используя sqlite3_create_collation()) и встроенные функции like(), upper() и lower() (используя sqlite3_create_function()). Исходный код SQLite включает расширение «ICU», которое выполняет эти перегрузки. Или разработчики могут писать свои собственные перегрузки на основе своих рутинных по Юникоду процедур сравнения, уже содержащихся в их проекте.

Ссылка: http://www.sqlite.org/faq.html

+0

Thanx для ответа. Но как реализовать его в Java/Android? Учитывая, что исходная таблица доступна только для чтения? Я бы очень признателен за вашу помощь – barmaley

+0

Я люблю это делать, но я программист на C++ и имею меньше знаний о java. –

Смежные вопросы