Вьетнамский текстовый поиск 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);
...
Другие вопросы по тегам