You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SELECT语句中移除列值中的Emoji表情

嘿,这个需求我碰到过好多次了!要移除SQL表列里的所有Emoji表情,不同数据库的实现方式略有不同,我给你分场景整理好具体的解决方案,直接就能用~

MySQL/MariaDB 解决方案

MySQL 8.0+ 和 MariaDB 支持 REGEXP_REPLACE 函数,我们可以用它匹配所有Emoji的Unicode范围,然后替换为空字符串。Emoji主要分布在几个Unicode区块,所以正则表达式要覆盖这些范围:

SELECT 
    REGEXP_REPLACE(
        your_column_name,
        '[\x{1F600}-\x{1F6FF}\x{1F300}-\x{1F5FF}\x{1F900}-\x{1F9FF}\x{1F1E0}-\x{1F1FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}]',
        ''
    ) AS cleaned_column
FROM your_table_name;

解释:

  • your_column_name 替换成你要处理的列名,your_table_name 替换成你的表名
  • 正则里的每个区间对应不同类型的Emoji:表情符号、物品符号、人物符号、国旗符号等,基本覆盖了绝大多数常见Emoji
  • 执行后,所有匹配到的Emoji都会被移除,剩下纯文本内容

PostgreSQL 解决方案

PostgreSQL 的 regexp_replace 函数支持Unicode正则,写法和MySQL类似,但要加上全局替换参数 'g'(默认只替换第一个匹配项):

SELECT 
    regexp_replace(
        your_column_name,
        '[\u{1F600}-\u{1F6FF}\u{1F300}-\u{1F5FF}\u{1F900}-\u{1F9FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]',
        '',
        'g'
    ) AS cleaned_column
FROM your_table_name;

解释:

  • 'g' 参数确保替换所有匹配到的Emoji,而不是只替换第一个
  • PostgreSQL 用 \u{XXXX} 来表示Unicode字符,和MySQL的 \x{XXXX} 写法略有不同,但效果一致

SQL Server 解决方案

SQL Server 原生没有直接支持Unicode正则的函数,不过我们可以通过自定义函数结合 PATINDEX 和循环来实现。这个方法会移除所有非基本ASCII和扩展ASCII的字符(Emoji都属于这类):

首先创建一个自定义函数:

CREATE FUNCTION dbo.RemoveEmoji(@Input NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    -- 定义匹配非基本/扩展ASCII字符的模式(Emoji都在这个范围外)
    DECLARE @EmojiPattern NVARCHAR(100) = N'%[^' + NCHAR(0x0020) + N'-' + NCHAR(0x007E) + NCHAR(0x00A0) + N'-' + NCHAR(0x00FF) + N']%'
    
    -- 循环移除所有匹配的字符
    WHILE PATINDEX(@EmojiPattern, @Input) > 0
    BEGIN
        SET @Input = STUFF(@Input, PATINDEX(@EmojiPattern, @Input), 1, '')
    END
    
    RETURN @Input
END

然后在查询中使用这个函数:

SELECT dbo.RemoveEmoji(your_column_name) AS cleaned_column
FROM your_table_name;

解释:

  • 这个函数会保留空格、字母、数字、标点以及扩展ASCII字符(比如欧洲语言的特殊字符),移除所有超出这个范围的字符,包括所有Emoji
  • 如果你的业务需要保留其他特定Unicode字符,可以调整 @EmojiPattern 里的字符范围

测试示例

假设你的列中有值:"I'm a 👨‍💻 👩‍💻 Developer 👨‍💻 👩‍💻 .",执行上述任意数据库的查询后,都会得到:"I'm a Developer .",完全符合你的需求~

内容的提问来源于stack exchange,提问作者SaTyA

火山引擎 最新活动