AWS Redshift中ILIKE无法匹配大小写不同重音字符问题咨询
关于Redshift ILIKE匹配重音字符异常问题的解答
这既不是Redshift的缺陷,也不是操作疏漏,属于Redshift ILIKE的默认行为设计。
问题根因
Redshift的ILIKE运算符默认仅对ASCII范围内的a-z、A-Z字符做大小写不敏感匹配,带重音的Unicode字符(如ã、ç、á、ú等)不属于默认忽略大小写的范围,大小写不同的重音字符会被判定为不同字符,因此直接用ILIKE 'Campos do Jordão'只能匹配到大小写完全符合的2条记录。
使用UPPER函数处理后匹配正常的原因很明确:UPPER函数会对所有字符生效,包括带重音的Unicode字符,统一转为大写后再做匹配,自然就能覆盖所有大小写格式的记录。
推荐解决方案
如果需要同时实现大小写不敏感+重音不敏感的匹配,可选择两种实现方案:
- 方案1:查询时统一做字符归一,搭配
UPPER/LOWER和TRANSLATE函数处理字段和查询条件,不需要修改表结构:-- 示例:重音+大小写都不敏感的匹配,查询Campos do Jordão的所有记录 SELECT * FROM cities WHERE TRANSLATE(UPPER(city), 'ÃÁÀÂÇÉÊÍÕÓÔÚ', 'AAAACEEIOOOU') = TRANSLATE(UPPER('Campos do Jordão'), 'ÃÁÀÂÇÉÊÍÕÓÔÚ', 'AAAACEEIOOOU') - 方案2:建表时指定不区分大小写的排序规则,后续查询不需要额外加函数处理:
其中CREATE TEMPORARY TABLE cities ( city VARCHAR(256) COLLATE ci_as, state VARCHAR(256) );ci_as代表大小写不敏感、重音敏感,如果需要重音也不敏感,选择对应支持的排序规则即可。
内容的提问来源于stack exchange,提问作者Ralubrusto
相关产品推荐
相关产品推荐

