Like не работает с русскими символами? (Swift, SQLite)

#swift #sqlite #sqlite.swift

#swift #sqlite #sqlite.swift

Вопрос:

Я использую like со строчными и русскими символами, но LOWER не преобразует их в нижний регистр в запросе. Я попытался создать свою собственную функцию, но у меня это не сработало. Как решить эту проблему?

Изучив документацию SQLite, я узнал, что нужно подключить библиотеку ICU. Как это можно сделать в этом плагине?

Библиотека: stephencelis/SQLite.swift (https://github.com/stephencelis/SQLite.swift ) Спасибо за помощь.

 // in name value: ПРИВЕТ from database
let search_name = "Привет"
user.filter(name.lowercaseString.like("%"   search_name.lowercased()   "%"))
  

Ответ №1:

SQLite LOWER предназначен только для ASCII. Если вы хотите, чтобы для русского языка (или любых других символов, кроме ASCII) не учитывался регистр, используйте FTS3 / FTS4 https://www.sqlite.org/fts3.html (или FTS5 https://www.sqlite.org/fts5.html ).

SQLite.swift имеет соответствующие модули полнотекстового поиска https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#full-text-search

Чтобы использовать его в своем проекте с существующей базой данных, вы должны установить соединение с виртуальной таблицей через модуль FTS и отфильтровать запрос с помощью .match

     // CREATE VIRTUAL TABLE "table" USING fts4("row0", "row1"), if not exists
    try db.run(table.create(.FTS4(row0, row1), ifNotExists: true))
     
    // SELECT * FROM "table" WHERE "row0" MATCH 'textToMatch*'      
    try db.prepare(table.filter(row0.match("(textToMatch)*")))
    
    // SELECT * FROM "table" WHERE "any row" MATCH 'textToMatch*' 
    try db.prepare(table.match("(textToMatch)*")))