Postgres 9.5 中 Unicode 文本的一致性检查不一致?

sud*_*udo 6 postgresql unique-constraint unicode

使用 PostgreSQL 9.5。似乎 Postgres 与它比较类似于??. 一个唯一的约束是考虑一些相等的字符串,GROUP BY而这些字符串是不同的。

我有一个GROUP BYTEXT列上使用的选择查询和在其他一些列上使用的聚合函数以确保TEXT输出中列的唯一性,并且我将结果插入到具有主键(因此是唯一的)约束的表中这TEXT列。

看起来与此相似;为简单起见,我刚刚更改了表名:

 INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
            SELECT 
            sq1.string string, sq2.score / sq1.score
            FROM
            (
                SELECT n.string string, SUM(n.score) score
                FROM
                othertable1 n % has string TEXT (non-unique) and score INT
                GROUP BY string
            ) sq1,
            (
                SELECT n.string string, SUM(n.score) score
                FROM
                othertable2 n % has string TEXT (non-unique) and score INT
                GROUP BY string
            ) sq2
            WHERE sq1.string = sq2.string
            ORDER BY score DESC LIMIT 100000
        );
Run Code Online (Sandbox Code Playgroud)

这应该永远不会失败,对吧?它失败了:由于键违反了唯一约束??

并且它在 PG 9.3 中曾多次与其他包含数百万行的数据集一起使用;不知道有没有??当时在数据中。我知道阿拉伯语有可以放在字母上的装饰品,所以我想知道这是否会绊倒它。

有没有人有其他解释,或者我应该在可以更轻松地重现它后将其报告为错误?

更新:确认查询在具有相同数据的 PostgreSQL 9.3 服务器上成功运行。这里有一些变动的部分,所以我试图确切地找出有问题的字符串是什么,以便我可以制作一个简单的查询列表,任何人都可以运行以暴露错误。

更新 2:啊,我无法让我的数据库给我一组我可以复制到表中并暴露错误的字符串。我一直在尝试用COPY TO. 我认为,一路上的某些事情不断剥夺阿拉伯文本导致其失败的差异。但是我尝试了一个更简单的查询,它也失败了。更明显的是,这应该有效:

INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
    SELECT n.string string, SUM(n.score) score
    FROM
    othertable2 n % has string TEXT (non-unique) and score INT
    GROUP BY string
);
Run Code Online (Sandbox Code Playgroud)

我仍在努力获得其他人可以尝试的东西,因为当然,如果我说它只适用于我的数据,那么错误报告毫无用处。

更新 3:我用不同的数据再次运行它并遇到了与西里尔字符??. 制作一张包含它们的桌子并没有透露任何信息。我认为与阿拉伯文本的问题相同。一路上有些东西正在被剥离。

更新 4:这绝对是一个错误。我还在想办法报告这个问题。我找到了一个解决方法:

WITH glitch(string, score) AS (
    SELECT n.string string, SUM(n.score) score
    FROM
    othertable2 n % has string TEXT (non-unique) and score INT
    GROUP BY string
)
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
    SELECT DISTINCT ON(string) * FROM glitch
);
Run Code Online (Sandbox Code Playgroud)