1

由于 SQLite FTS4/FTS5 tokenizer=unicode61 给了我们:

a=A=ą=Ą=ä=Ä ...
z=ż=ź=Z=Ż=Ź=Ž=ž ...
etc...

为什么不 l=ł=L=Ł ??? 这不是一个错误吗?

如何在没有波兰字符 ł/Ł 的键盘上查询 SQLite?例如查询名称 Żabczyński 像“zabczynski” - 得到结果,但对于名称 Włast 像“wlast” - 0 结果(应该像数百......)我在 PHP 中有我的漫游,但它不适用于带有 l 的单词并在其中使用 ł,例如 'opłacalny'。

<?
$q = $_POST["q"];
//
$pat = '/(\b\w*[lł]\w*\b)/iu';
    $q = preg_replace_callback($pat,function($macz){
        return "(" . str_replace("ł","l",$macz[1]) . "* OR " . str_replace("l","ł",$macz[1]) . "*)";
    },$q);
// so query 'andrzej wlast' looks 'andrzej (wlast* OR włast*)'
...
    $sql = "SELECT ...";
    $pdo = $db->prepare($sql);
    //
    $pdo->execute([":q" => "$q*"]);
    //
    $odp = $pdo->fetchAll(PDO::FETCH_ASSOC);
?>

任何想法?您不能在 sqlite 中设置编码,例如 utf8_general_ci、utf8_polish_ci、utf8_unicode_ci... 或者是的,有可能吗?

有没有办法在 Python 中解决它?平台上没有 ICU(共享服务器)。

4

2 回答 2

1

不幸的是,不,SQLite 没有像 MySQL 这样的整理表,因为它会使本应是一个非常小且可移植的库变得臃肿。

您可以将查询转换为以下内容:

SELECT * FROM foo WHERE word REGEXP '^[ZŻ]abczy[nń]ski$';
SELECT * FROM foo WHERE word REGEXP '^W[lł]ast$';

在 Python 中这很容易:

def collatify(string, equivalents):
    for original, replacement in equivalents.items():
        string = string.replace(original, '[%s%s]' % (original, replacement))
    return string

collatify('Żabczyński', { "Ż": "Z", "ń": "n" })

不幸的是,这将使得无法使用索引来搜索这些字段。

更好的方法是做相反的操作,“asciify”你的字符串,并将它们作为附加列输入到数据库中(带有自己的索引!);然后“asciify”您的查询,并观察它的工作。更好的是,看看您的“asciified”查询是否与原始查询相同;如果是,请使用“asciified”列(因为用户只输入了 ASCII 字符);如果它们不同,则用户输入了波兰语特定的字符,并且可能会正确输入它们,因此请使用原始列。这样,如果用户输入“Żabczyński”,您在原始列中搜索“Żabczyński”并在那里找到它。如果用户输入“Zabczynski”,假设它可能是 asciified,并在 asciified 列中搜索;它会找到“Żabczyński”、“Zabczyński”、“

于 2018-08-16T10:55:34.287 回答
0

转移到 MySQL 或 Postgres。SQLite 有其局限性。

于 2019-01-20T14:16:39.963 回答