Вьетнамский текстовый поиск Unicode в SQLite
Я планирую написать приложение для iOS, которое использует SQLite в качестве бэкэнда. Моя база данных содержит вьетнамский текст, такой как "Hải Sơn". Пользователи, привыкшие к поиску в Google, хотят ввести поисковый запрос, например, "hai son", чтобы найти текст выше. Я попробовал следующий запрос:
SELECT * FROM towns WHERE title LIKE '%hai son%';
И я получил 0 записей. Как мне заставить это работать? Я знаю, что Google и другие поисковые системы занимаются этим делом, так что это можно сделать. Я также не хочу, чтобы мои пользователи печатали вьетнамский текст с полными диакритическими знаками, потому что не все пользователи знают, как это сделать.
Обновить
Я посмотрел документацию по sqlite3 и выяснил, что существует только три допустимые последовательности сортировки: BINARY, NOCASE и RTRIM. Я что-то пропустил?.
Больше информации
Моя таблица была создана с:
CREATE TABLE towns ( sid INTEGER PRIMARY KEY NOT NULL, title TEXT )
До сих пор я использовал только командную строку sqlite3 для создания базы данных, таблицы и импорта текста из файла CSV.
Мой sqlite3 находится на версии 3.7.12
Обновление 2
Псевдоним дал мне идею: создать свою собственную последовательность сортировки. Я опубликую продолжение, если оно будет работать.
2 ответа
Попробуй это:
SELECT * FROM towns WHERE title COLLATE UTF8CI LIKE '%hai son%';
Связанный с ответом, найденным здесь: Как мне преобразовать столбец в ASCII на лету без сохранения, чтобы проверить совпадения с внешней строкой ASCII?
Я знаю, что это старая ветка, но я нашел решение, поэтому разместил ее для других. Если вы используете библиотеку sqlite3, вы можете использовать sqlite3_bind_text()
как ниже
...
sqlite3_stmt *detailStmt;
NSString *t1=@"%%Hải Sơn%%";
const char *sql = "SELECT * FROM towns WHERE title LIKE ?";
if(sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) == SQLITE_OK)
{
sqlite3_bind_text(detailStmt, 1, [t1 UTF8String], -1, SQLITE_TRANSIENT);
...