有什么方法可以用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'
,因为👍🏻
是不同的字形。
这可能吗?
这是一个非常有趣的问题!
我不太确定这是否可能:
事实上,有皮肤的表情符号是两个相连的字符(比如连字(。第一个字符是黄色的手👍然后是表情符号皮肤修饰🏻
这就是浅色皮肤的手在内部存储的方式。所以,对我来说,你的结果是有道理的:
当您查询任何字符串时,该字符串以👍,它将返回:
👍 Two
(琐碎(👍_🏻 One
(忽略下划线,我尝试用它来抑制自动连字(
所以,你可以看到,浅肤色的表情符号内部也以👍.这就是为什么我相信,你的查询不会以你喜欢的方式工作。
解决方法/解决方案:
-
您可以在查询中添加空格。这样可以确保在👍性格当然,这只适用于您的情况,即所有数据集的指针后面都有一个空格:
SELECT * FROM test WHERE name LIKE '👍 %';
-
您可以简单地扩展
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 '👍🏿%'
-
您可以使用正则表达式模式匹配来排除皮肤:
SELECT * FROM test WHERE name ~ '^👍[^🏻🏼🏽🏾🏿]*$'
请参阅演示:db<gt;fiddle(注意fiddle似乎不提供自动连字,所以两个字符都是分开显示的(