如何在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




