如何在 sql 服务器中 trim 字符串(带有表意文字 space U+3000)?

How to trim string (with Ideographic space U+3000) in sql server?

我必须 trim 日语字符串,它在字符串的开头和字符串的结尾都有双字节 space。 我必须通过 SQL 服务器 2016 的程序来执行此操作。

例如,

SELECT  LTRIM(RTRIM(' A A ')) 

上面一个是完美的

但问题出在风箱线

SELECT  LTRIM(RTRIM(' A A '))

我想要上面的输出是'A A'

知道怎么做吗?

改编自 OP 的 SQL post:

SELECT LTRIM(RTRIM(REPLACE(' A A ', '  ', ' ')))

结果截图:

该字符串中的 space 是 Ideographic space (U+3000) Unicode 字符,LTRIM 和 RTRIM 无法识别为白色space。除非明确指定,否则 SQL Server 2017 中的 TRIM 也不会识别它。

另一个问题是这个字符超出了正常的字符范围,不能出现在varchar字段或值中。这会导致 SQL 服务器版本之间的结果不一致。在 SQL Server 2014 中,它甚至会显示为 ?。在更高版本中,LTRIM/RTRIM 可能会或可能不会在不发出错误字符的情况下工作。我无法访问所有版本来对此进行测试。

在 SQL Server 2017 中可以明确指定修剪字符,例如:

select trim(N' ' from N' A A ')

这会产生 A A

在以前的版本中,PATINDEX可以用来查找第一个和最后一个非space位置的位置:

declare @str nvarchar(10)=N' A A ';
declare @start int=PATINDEX(N'%[^ ]%',@str)
declare @end int=PATINDEX(N'% ',@str)
SELECT  SUBSTRING(@str,@start,@end-@start) 

模式N'%[^ ]%' 查找字符串中的第一个非U+3000 字符。 N'%∀' 找到最后一个的位置。 SUBSTRING(@str,@start,@end-@start)提取两个位置之间的内容。

结果是:

A A

我有解决办法 非常感谢你的努力。 请使用此函数删除双字节space。

创建函数 [RTRIMBYTE](@AV_VALUE NVARCHAR(MAX)) RETURNS NVARCHAR(最大值) 作为 开始

DECLARE @AV_RETURN NVARCHAR(MAX) = @AV_VALUE;

WHILE DATALENGTH(@AV_RETURN) > 0 AND  RIGHT(@AV_RETURN, 1) in (' ', ' ')
    SET @AV_RETURN = LEFT(@AV_RETURN, LEN('X' + @AV_RETURN + 'X') -3 ) ;

RETURN @AV_RETURN;

结束;