比较高棉语字符串与空字符串时,NULLIF/IIF返回异常结果求助
T-SQL高棉语字符串与空字符串比较异常的原因解析
核心问题根源:排序规则对Unicode字符的归类处理
你碰到的问题是因为SQL Server的排序规则在处理特定高棉语Unicode字符时,将这些字符归类为「空白类」字符,导致和空字符串('')比较时被判定为相等。这类字符虽然实际存在(所以LEN能统计出长度7),但在默认排序规则的比较逻辑里会被当作空白忽略。
各语句结果的逻辑拆解
SELECT LEN(N'ធ្វើឱ្យ')返回7:LEN函数只统计字符串的实际字符数量,不管字符是否属于空白类,所以能准确反映真实的字符长度。SELECT IIF(N'ធ្វើឱ្យ' = '', 1, 0)返回1:默认排序规则(比如常见的SQL_Latin1_General_CP1_CI_AS)会按照字符的语义分类做比较,把你用到的高棉语字符识别为等价于空白,因此判定和空字符串相等。SELECT NULLIF(N'ធ្វើឱ្យ', '')返回NULL:这个函数的逻辑是「如果两个表达式相等则返回NULL,否则返回第一个表达式」,所以结果和上面的比较一致。
解决方法:强制使用二进制排序规则做精确比较
如果需要严格按照字符的实际内容比较,避免排序规则的干扰,可以在比较时指定二进制排序规则,比如:
-- 精确比较,返回0(表示不相等) SELECT IIF(N'ធ្វើឱ្យ' COLLATE Latin1_General_BIN = '', 1, 0) -- 精确匹配,返回原高棉语字符串 SELECT NULLIF(N'ធ្វើឱ្យ' COLLATE Latin1_General_BIN, '')
二进制排序规则会直接按照字符的Unicode码点逐一对比,不会对字符做归类处理,能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者gotqn
相关产品推荐
相关产品推荐

