MS-SQL字符串末尾特殊空格问题:TRIM函数无效排查
MS-SQL中字符串末尾特殊空格的异常情况
在MS-SQL环境里碰到一个特殊问题:部分字符串末尾存在ASCII码为32的空格,但这个空格不在SQL默认认定的字符串长度范围内,导致常规处理函数失效:
- 调用
TRIM()函数处理后,原字符串和处理后的结果会被判定为相等 LEN()函数返回的是去除该空格后的长度,实际空格位于SQL识别的字符串末尾之后
在十亿级数据量的SE_Keywords表中,仅发现143条这类异常数据。可以用以下SQL查询验证该现象:
select k.Keyword, len(k.Keyword) LenKeyword, trim(k.Keyword) TrimKeyword, case when k.Keyword=trim(k.Keyword) then 1 else 0 end isSame, len(trim(k.Keyword)) LenTrimKeyword, SUBSTRING(k.Keyword,len(k.keyword)+1,1) LastCharPlus1, ASCII(SUBSTRING(k.Keyword,len(k.keyword)+1,1)) AsciiLastCharPlus1 from #tk AdditionalSpaceAfterEndOfString inner join SE_Keywords k on AdditionalSpaceAfterEndOfString.Keyword=k.Keyword and AdditionalSpaceAfterEndOfString.Lang=k.Lang and AdditionalSpaceAfterEndOfString.Country=k.Country order by k.DateAdded desc
查询结果会呈现这些特征:
isSame字段值为1,说明原字符串与TRIM处理后的字符串被判定相等LenKeyword和LenTrimKeyword的数值完全一致AsciiLastCharPlus1返回32,确认这个特殊空格的ASCII码
需要注意的是,TRIM()函数无法处理这类异常空格,只能通过以下语句筛选出这类数据:
SELECT Keyword, Lang, Country INTO #tk FROM se_keywords WHERE ASCII(SUBSTRING(Keyword,LEN(keyword)+1,1)) IS NOT NULL
内容的提问来源于stack exchange,提问作者Gregory Liénard
相关产品推荐
相关产品推荐

