Postgres如何实现特殊字体/编码文本与常规文本的对比?
解决Postgres中特殊字体文本与常规文本的对比问题
这些像𝕗𝕒𝕤𝕥的特殊字体文本,本质是Unicode里的装饰性变体字符(比如数学双线体、粗体、斜体字母),它们的码点和普通拉丁字母完全不同,所以直接对比肯定不相等。你可以用以下两种方法解决:
方法一:自定义转换函数(推荐)
写一个PL/pgSQL函数,把常见的花式字体字符映射成对应的普通拉丁字母。比如针对数学双线体、粗体、斜体这些手机特殊键盘常用的字体:
CREATE OR REPLACE FUNCTION convert_fancy_text(text) RETURNS text AS $$ DECLARE result text := ''; c char; code integer; BEGIN FOR c IN SELECT unnest(string_to_array($1, '')) LOOP code := ascii(c); -- 数学双线小写字母(对应普通a-z) IF code BETWEEN 120151 AND 120176 THEN result := result || chr(code - 120141); -- 数学粗体小写字母 ELSIF code BETWEEN 119834 AND 119859 THEN result := result || chr(code - 119768); -- 数学斜体小写字母 ELSIF code BETWEEN 119886 AND 119911 THEN result := result || chr(code - 119820); -- 数学双线大写字母(对应普通A-Z) ELSIF code BETWEEN 120128 AND 120150 THEN result := result || chr(code - 120064); -- 数学粗体大写字母 ELSIF code BETWEEN 119808 AND 119833 THEN result := result || chr(code - 119744); -- 数学斜体大写字母 ELSIF code BETWEEN 119856 AND 119885 THEN result := result || chr(code - 119792); ELSE result := result || c; END IF; END LOOP; RETURN result; END; $$ LANGUAGE plpgsql IMMUTABLE;
使用时直接转换后对比:
-- 验证特殊字体与常规文本是否匹配 SELECT convert_fancy_text('𝕗𝕒𝕤𝕥') = 'fast'; -- 返回 true -- 查询数据库中匹配的记录 SELECT * FROM your_table WHERE convert_fancy_text(your_column) = 'fast';
如果遇到其他类型的花式字体(比如手写体、哥特体),只要找到对应的Unicode码点范围,给函数添加对应的判断分支即可。
方法二:临时字符映射(适合少量固定场景)
如果只有少量特定的特殊字符需要处理,直接用translate函数做字符替换:
SELECT translate('𝕗𝕒𝕤𝕥', '𝕗𝕒𝕤𝕥', 'fast') = 'fast'; -- 返回 true
这种方法简单但灵活性差,只适合已知所有需要替换的特殊字符的场景。
内容的提问来源于stack exchange,提问作者lkartono
相关产品推荐
相关产品推荐

