PostgreSQL如何动态查询字段包含Emoji表情的数据行
PostgreSQL 动态筛选包含Emoji的文本行实现方案
你当前使用的硬编码IN匹配方案存在两个核心局限:
- 需要手动维护Emoji值列表,无法自动适配后续新增的Emoji类型
- 仅支持整行内容和Emoji值精确匹配,无法识别文本中间嵌入的Emoji(比如
Hi 😀这类混合文本会被直接漏筛)
以下是两种无需手动维护列表的动态实现方式:
方案1:基于Unicode码位区段正则匹配(全版本兼容)
Emoji在Unicode字符集中有固定的分配码位段,通过正则直接匹配所有Emoji所属的码位范围,不需要枚举单个Emoji值,即可覆盖当前已收录的绝大多数Emoji类型。
可直接使用的查询语句:
SELECT message_text FROM cb_messages_v1 cmv WHERE message_text ~ '[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F800}-\x{1F8FF}\x{1F900}-\x{1F9FF}\x{1FA00}-\x{1FA6F}\x{1FA70}-\x{1FAFF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}\x{1F3FB}-\x{1F3FF}]';
这段正则覆盖的码位包含基础图形表情、交通符号、补充表情、扩展Emoji区段、肤色修饰符等所有常见Emoji类型,对带肤色的表情(比如👍🏻)也可以正常识别。
方案2:基于内置Unicode属性精准匹配(推荐)
PostgreSQL 12及以上版本默认开启ICU正则支持,可以直接调用Unicode标准定义的Emoji属性做匹配,不需要手动维护码位范围,适配精度和新Emoji的覆盖度更高。
查询语句写法:
SELECT message_text FROM cb_messages_v1 cmv WHERE message_text ~ '\p{Emoji}';
这种写法的匹配逻辑会跟随PostgreSQL内置的Unicode字符库升级自动更新,后续Unicode标准新增的Emoji类型只要被收录到对应属性集中,就可以被自动识别,完全不需要手动调整匹配规则。
小提示:该属性规则会同时覆盖可切换为Emoji样式的文本字符(如数字、常用符号),如果业务场景需要严格匹配非文本类的纯Emoji,可以根据实际需求在正则中追加Emoji变体选择符的判断条件即可。
内容的提问来源于stack exchange,提问作者cluis92
相关产品推荐
相关产品推荐

