如何搜索包含表情符号的文本?

Posted

技术标签:

【中文标题】如何搜索包含表情符号的文本?【英文标题】:How would I search for text that contains emojis? 【发布时间】:2018-01-07 06:40:09 【问题描述】:

我们有一个 mysql InnoDB 表,其中包含一个文本字段 COLLATE utf8mb4_unicode_ci。我需要搜索包含任何表情符号字符的行。我已经搜索了很多 SO 问题,但人们似乎有一个他们正在搜索的表情符号列表。我实际上正在寻找可以找到任何表情符号的解决方案。 Here are some 没有帮助的帖子。

This one 似乎最接近于实际向我提供我正在寻找的东西,但 OP 并没有真正发布他的搜索代码。

谢谢!

【问题讨论】:

我没试过,但是……你可以从unicode.org/Public/emoji/5.0导入一张表中的所有表情符号,然后通过like条件加入你自己的表。 你想对找到的行做什么? @Stefan 你找到解决方案了吗? @ThomasPaine 抱歉,不完全是,我最终在应用层实现了这个需求。祝您搜索顺利 你在一个很好的轨道上,我发布了答案,虽然可能有点晚了。 ???? 【参考方案1】:

我遇到过从一台服务器迁移到另一台服务器的数据库导致表情符号消失的情况。所以我必须找到原始表中包含高 utf8(表情符号)字符的所有行。

此查询按预期工作:

SELECT field FROM `table` WHERE HEX(field) RLIKE "^(..)*F.";

在做任何事情之前检查你是否在你的数据库、表和连接上使用 utf8mb4:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

【讨论】:

【参考方案2】:

这可能行得通吗?

使用 mysql UDF 存储库中的 lib_mysqludf_preg 库直接在 mysql 中进行 PCRE 正则表达式

[\x23\x2A\x30-\x39\xA9\xAE\x203C\x2049\x2122\x2139\x2194-\x2199\x21A9-\x21AA\x231A-\x231B\x2328\x23CF\x23E9-\x23F3\x23F8-\x23FA\x24C2\x25AA-\x25AB\x25B6\x25C0\x25FB-\x25FE\x2600-\x2604\x260E\x2611\x2614-\x2615\x2618\x261D\x2620\x2622-\x2623\x2626\x262A\x262E-\x262F\x2638-\x263A\x2640\x2642\x2648-\x2653\x2660\x2663\x2665-\x2666\x2668\x267B\x267F\x2692-\x2697\x2699\x269B-\x269C\x26A0-\x26A1\x26AA-\x26AB\x26B0-\x26B1\x26BD-\x26BE\x26C4-\x26C5\x26C8\x26CE-\x26CF\x26D1\x26D3-\x26D4\x26E9-\x26EA\x26F0-\x26F5\x26F7-\x26FA\x26FD\x2702\x2705\x2708-\x270D\x270F\x2712\x2714\x2716\x271D\x2721\x2728\x2733-\x2734\x2744\x2747\x274C\x274E\x2753-\x2755\x2757\x2763-\x2764\x2795-\x2797\x27A1\x27B0\x27BF\x2934-\x2935\x2B05-\x2B07\x2B1B-\x2B1C\x2B50\x2B55\x3030\x303D\x3297\x3299\x1F004\x1F0CF\x1F170-\x1F171\x1F17E-\x1F17F\x1F18E\x1F191-\x1F19A\x1F1E6-\x1F1FF\x1F201-\x1F202\x1F21A\x1F22F\x1F232-\x1F23A\x1F250-\x1F251\x1F300-\x1F321\x1F324-\x1F393\x1F396-\x1F397\x1F399-\x1F39B\x1F39E-\x1F3F0\x1F3F3-\x1F3F5\x1F3F7-\x1F4FD\x1F4FF-\x1F53D\x1F549-\x1F54E\x1F550-\x1F567\x1F56F-\x1F570\x1F573-\x1F57A\x1F587\x1F58A-\x1F58D\x1F590\x1F595-\x1F596\x1F5A4-\x1F5A5\x1F5A8\x1F5B1-\x1F5B2\x1F5BC\x1F5C2-\x1F5C4\x1F5D1-\x1F5D3\x1F5DC-\x1F5DE\x1F5E1\x1F5E3\x1F5E8\x1F5EF\x1F5F3\x1F5FA-\x1F64F\x1F680-\x1F6C5\x1F6CB-\x1F6D2\x1F6E0-\x1F6E5\x1F6E9\x1F6EB-\x1F6EC\x1F6F0\x1F6F3-\x1F6F6\x1F910-\x1F91E\x1F920-\x1F927\x1F930\x1F933-\x1F93A\x1F93C-\x1F93E\x1F940-\x1F945\x1F947-\x1F94B\x1F950-\x1F95E\x1F980-\x1F991\x1F9C0]

【讨论】:

【参考方案3】:

在我看来,最简单的方法是创建一个包含所有表情符号代码的表格,然后通过like 条件连接到您的表格。

我在这里分享how to insert emotis on mysql:

create table emojis (
  e varchar(100) COLLATE utf8mb4_unicode_ci
 );

 insert into emojis values
 ( _utf8mb4 0xF09F9881 COLLATE utf8mb4_unicode_ci),
 ( _utf8mb4 '?' );

最终查询应如下所示:

select distinct yt.id
from your_table yt
inner join emojis e 
  on yt.some_column like '%' + e.e + '%'

【讨论】:

以上是关于如何搜索包含表情符号的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python在字符串中查找和计算表情符号?

如何使用 javascript 检测表情符号

如何使用 javascript 检测表情符号

如何使用 Telegram Bot API 发送表情符号?

在 Flutter 上显示带有表情符号的文本

如何将表情符号嵌入到 Tweepy 状态文本中?