Firebird 2.5.9中LIKE与=运算符对Unicode字符的匹配差异问题
Firebird Classic v2.5.9中=与LIKE运算符在unicode_ci_ai规则下的行为差异分析
这是Firebird结合ICU库处理Unicode排序规则时的特性,而非Bug,原因如下:
等值判断与唯一约束的逻辑:
在unicode_ci_ai(不区分大小写、不区分重音)排序规则中,ICU库会将部分语言特有的字符归为等价字符,波兰语的ł和普通l就属于这类等价组。=运算符和唯一约束完全依赖排序规则的等价归类逻辑,因此会判定两者相等,插入时触发唯一键冲突。LIKE运算符的匹配逻辑:
LIKE的匹配逻辑并非完全照搬排序规则的等价归类,而是更偏向于字符的字面匹配(仅对通用重音字符做折叠)。针对ł这类语言专属字符,在ICU 72版本的unicode_ci_ai规则下,Firebird的LIKE实现不会将其折叠为l,因此判定两者不相等。é等字符的一致性原因:
é属于通用重音字符,其折叠规则在等值判断和LIKE匹配中是统一的,都会被处理为e,因此两种运算符的结果一致。
内容的提问来源于stack exchange,提问作者wuestenwal
相关产品推荐
相关产品推荐

