为何SQL LIKE查询对特殊字体存储的字符串返回0结果?
问题原因分析
字符底层编码完全不同:你看到的特殊字体文本
ᴄᴇʀᴛɪꜰɪᴇᴅ ɪɴꜱᴛᴀʟʟᴇʀꜱ,每个字母都是Unicode里的独立修饰字符(比如空心小写c的码点是U+1D40C),和普通ASCII的CERTIFIED INSTALLER(普通大写C的码点是U+0043)属于完全不同的字符。数据库存储和匹配的是字符的编码值,不是视觉外观,所以LIKE查询会判定两者不匹配。LIKE匹配不识别视觉相似性:SQL的LIKE操作是基于字符编码的严格匹配,不会把视觉上相似的不同字符视为同一内容。哪怕两个字符看起来几乎一样,只要编码码点不一样,就不会被匹配到。
默认字符集规则不做等价转换:大部分数据库默认的字符集和排序规则,只会严格匹配相同码点的字符,不会自动将这类特殊修饰字母映射为普通字母。只有专门配置了支持Unicode等价匹配的规则,才可能忽略这类视觉变体差异。
可行的解决方向
- 入库前统一清洗:把所有特殊字体字符转换为普通ASCII字符后再存储,从源头避免问题。
- 查询时做字符转换:根据你使用的数据库,调用对应的字符转换函数(比如PostgreSQL的
unaccent扩展、MySQL的UNACCENT函数,部分场景下需要额外处理修饰字母的映射),将查询字符串和存储文本统一转换为普通字符后再匹配。
内容的提问来源于stack exchange,提问作者shane
相关产品推荐
相关产品推荐

