如何移除SQL Server 2016中文字符串末尾的ASCII 32空格字符
问题根因
你遇到的现象是两个常见误区共同导致的:
- SQL Server 内置的
TRIM、RTRIM函数默认仅能移除ASCII码为32的普通半角空格,无法处理全角空格(Unicode U+3000,ASCII码12288)、不间断空格(Unicode U+00A0,ASCII码160)、制表符等其他空白字符。 LEN函数本身存在特性限制:统计字符串长度时会自动忽略末尾的半角空格,无法准确判断末尾空格是否被真实移除,要准确验证应该使用DATALENGTH函数统计字节数。
验证方法
首先查询末尾字符的真实编码,确认是哪类空白:
-- 取字符串最后一个字符的Unicode编码 SELECT UNICODE(RIGHT(N'胸痹心痛 ', 1))
- 返回32:普通半角空格,此时需要替换为
DATALENGTH验证移除效果 - 返回12288:全角空格
- 返回160:不间断空格
- 其他值:对应其他特殊空白字符,可按需补充处理逻辑
可行解决方法
- 方案1:针对性替换指定空白字符,适用于临时查询场景
-- 示例:同时处理半角空格、全角空格、不间断空格 SELECT DATALENGTH( REPLACE( REPLACE( RTRIM(N'胸痹心痛 '), NCHAR(12288), '' -- 移除全角空格 ), NCHAR(160), '' -- 移除不间断空格 ) ) / 2 -- 除以2得到nvarchar类型的真实字符数
- 方案2:封装自定义函数,适用于需要频繁处理空白的业务场景
CREATE FUNCTION dbo.CustomRTrim(@Input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN -- 先移除默认半角空格 SET @Input = RTRIM(@Input) -- 循环移除末尾的其他常见空白字符,可按需在IN列表中新增要处理的字符编码 WHILE LEN(@Input) > 0 AND UNICODE(RIGHT(@Input, 1)) IN (12288, 160, 9) BEGIN SET @Input = LEFT(@Input, LEN(@Input) - 1) END RETURN @Input END GO -- 调用示例 SELECT DATALENGTH(dbo.CustomRTrim(N'胸痹心痛 ')) / 2
内容的提问来源于stack exchange,提问作者Guang Zheng
相关产品推荐
相关产品推荐

