SQL Server处理半表情符号行为不一致的原因及UNION疑问
问题解答
1. 完整表情符号与半表情符号的集合运算符和字符串函数差异原因
- 集合运算符(
UNION/INTERSECT/EXCEPT)的比较逻辑基于数据库排序规则的语义等效性:大部分数据库的默认排序规则会将Unicode中语义等效的字符(比如完整表情和对应的拆分式半表情,属于Unicode等效字符对)视为相等,这类比较不关注字符底层的存储字节或代码点数量,只看语义是否一致。 LEFT()、LEN()等字符串函数是基于**字符的底层存储单元(代码点/字节)**处理:完整表情通常是单个Unicode代码点,而半表情可能是多个代码点的组合(比如基础字符+修饰符号),LEN()会统计实际的代码点或字节数,LEFT()按代码点截取,所以两者处理结果自然不同。
2. UNION运算符返回第二个值的原因
当UNION处理的两个值被排序规则判定为相等时,它会执行去重操作,最终保留的是第二个出现的匹配值。这是因为多数数据库的UNION去重逻辑中,当发现重复的等效值时,会覆盖前面的条目,保留后续遇到的那个值。如果是UNION ALL(不去重),则会同时返回两个值,但UNION默认去重时就会呈现这种“返回第二个值”的表现。
内容的提问来源于stack exchange,提问作者AHiggins
相关产品推荐
相关产品推荐

