PostgreSQL模式与Unicode字形匹配



有什么方法可以用Unicode字形进行模式匹配吗?

举个简单的例子,当我运行这个查询时:

CREATE TABLE test (
id SERIAL NOT NULL, 
name VARCHAR NOT NULL,
PRIMARY KEY (id), 
UNIQUE (name)
);
INSERT INTO test (name) VALUES ('👍🏻 One');
INSERT INTO test (name) VALUES ('👍 Two');
SELECT * FROM public.test WHERE test.name LIKE '👍%';

我会返回两行,而不仅仅是'👍 Two'。Postgres似乎只是在比较代码点,但我希望它能比较完整的字形,所以它应该只匹配'👍 Two',因为👍🏻是不同的字形。

这可能吗?

这是一个非常有趣的问题!

我不太确定这是否可能:

事实上,有皮肤的表情符号是两个相连的字符(比如连字(。第一个字符是黄色的手👍然后是表情符号皮肤修饰🏻

这就是浅色皮肤的手在内部存储的方式。所以,对我来说,你的结果是有道理的:

当您查询任何字符串时,该字符串以👍,它将返回:

  1. 👍 Two(琐碎(
  2. 👍_🏻 One(忽略下划线,我尝试用它来抑制自动连字(

所以,你可以看到,浅肤色的表情符号内部也以👍.这就是为什么我相信,你的查询不会以你喜欢的方式工作。

解决方法/解决方案:

  1. 您可以在查询中添加空格。这样可以确保在👍性格当然,这只适用于您的情况,即所有数据集的指针后面都有一个空格:

    SELECT * FROM test WHERE name LIKE '👍 %';
    
  2. 您可以简单地扩展WHERE子句,如下所示:

    SELECT * FROM test 
    WHERE name LIKE '👍%'
    AND name NOT LIKE '👍🏻%'
    AND name NOT LIKE '👍🏼%'
    AND name NOT LIKE '👍🏽%'
    AND name NOT LIKE '👍🏾%'
    AND name NOT LIKE '👍🏿%'
    
  3. 您可以使用正则表达式模式匹配来排除皮肤:

    SELECT * FROM test 
    WHERE name  ~ '^👍[^🏻🏼🏽🏾🏿]*$'
    

请参阅演示:db<gt;fiddle(注意fiddle似乎不提供自动连字,所以两个字符都是分开显示的(

最新更新