如何在sql server中修剪字符串(使用表意空间U+;3000)?

如何在sql server中修剪字符串(使用表意空间U+;3000)?,sql,sql-server,database,sql-server-2016,Sql,Sql Server,Database,Sql Server 2016,我必须修剪在字符串开始和结束处有双字节空间的日语字符串。 我必须按照SQL server 2016的程序来执行此操作 比如说, SELECT LTRIM(RTRIM(' A A ')) 以上一个是完美的工作 但问题在于风箱线 SELECT LTRIM(RTRIM(' A A ')) 我想上面一个的输出是‘A’ A' 你知道怎么做吗 改编自OP的帖子: SELECT LTRIM(RTRIM(REPLACE(' A A ', ' ', ' '))) 显示结果的屏幕截图: 改编自OP的帖

我必须修剪在字符串开始和结束处有双字节空间的日语字符串。 我必须按照SQL server 2016的程序来执行此操作

比如说,

SELECT  LTRIM(RTRIM(' A A ')) 
以上一个是完美的工作

但问题在于风箱线

SELECT  LTRIM(RTRIM(' A A '))
我想上面一个的输出是‘A’ A'


你知道怎么做吗

改编自OP的帖子:

SELECT LTRIM(RTRIM(REPLACE(' A A ', '  ', ' ')))
显示结果的屏幕截图:


改编自OP的帖子:

SELECT LTRIM(RTRIM(REPLACE(' A A ', '  ', ' ')))
显示结果的屏幕截图:


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

另一个问题是,此字符超出了正常字符范围,不能出现在
varchar
字段或值中。这会导致SQL Server版本之间的结果不一致。在SQL Server 2014中,它甚至会显示为
。在更高版本中,如果不发出错误字符,LTRIM/RTRIM可能工作,也可能不工作。我没有访问所有版本的权限来测试这个

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

select trim(N' ' from N' A A ')
这将产生
A A

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

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'% ' 查找最后一个位置。
子字符串(@str、@start、@end-@start)
提取两个位置之间的内容

结果是:


A A

该字符串中的空格是(U+3000)Unicode字符,LTRIM和RTRIM不会将其识别为空白。即使SQL Server 2017中的TRIM也不会识别它,除非明确指定

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

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

select trim(N' ' from N' A A ')
这将产生
A A

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

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'% ' 查找最后一个位置。
子字符串(@str、@start、@end-@start)
提取两个位置之间的内容

结果是:

A 我得到了一个解决方案
非常感谢你的努力。
请使用此功能删除双字节空间。

创建函数[RTRIMBYTE](@AV_值NVARCHAR(MAX)) 返回NVARCHAR(最大值) 作为 开始

结束;

我找到了解决方案 非常感谢你的努力。 请使用此功能删除双字节空间。

创建函数[RTRIMBYTE](@AV_值NVARCHAR(MAX)) 返回NVARCHAR(最大值) 作为 开始



结束;

无复制。
选择“|”+LTRIM(RTRIM('A A'))+“|”
返回
|A |
。从两个脚本获得相同的结果。不确定问题出在哪里:(首先,
double byte space
是什么意思?两个空格?或者其他一些空格字符?顺便说一句,标签中的SQL Server版本在相当长的一段时间内都不受支持。可能是受支持的版本成功地处理了非空格character@mkRabbani我复制了第二个脚本并添加了替换,这给了back“a”的结果请检查我编辑的帖子?好的,我可以验证问题是否只发生在旧的SQL Server版本上,因为那里使用了非空格字符。在SQL Server 2017中,甚至该字符也被视为空格并被修剪。事实上,旧版本会损坏该字符,因为它超出了正常的字符范围。您应该se
N' A. A. '代替无复制。
选择“|”+LTRIM(RTRIM('A A'))+“|”
返回
|A |
。从两个脚本获得相同的结果。不确定问题出在哪里:(首先,
double byte space
是什么意思?两个空格?或者其他一些空格字符?顺便说一句,标签中的SQL Server版本在相当长的一段时间内都不受支持。可能是受支持的版本成功地处理了非空格character@mkRabbani我复制了第二个脚本并添加了替换,这给了back“a”的结果请检查我编辑的帖子?好的,我可以验证问题是否只发生在旧的SQL Server版本上,因为那里使用了非空格字符。在SQL Server 2017中,甚至该字符也被视为空格并被修剪。事实上,旧版本会损坏该字符,因为它超出了正常的字符范围。您应该se
N' A. A. '
不需要,因为OP的声明无法复制这对OP的字符串不起作用。它不包含两个空格,只包含一个双倍宽度的空白字符。即使搜索字符串替换为双倍宽度的空格,这也会删除字母之间的空格。您的答案是“AA”,但我希望”“是的 “.”表示两个文件中的双字节空间A@NikunjChavda这不是一个双字节的空间。说这只会让人困惑。使用正确的名称,或者Unicode代码,而不是奇怪的…我用建议的脚本得到了正确的输出。我使用了SSMS v18.14和MSSQL v13.0.5492.2,不需要这样做,因为OP的声明无法复制。这对OP的字符串。它不包含两个空格,只包含一个双倍宽度的空白字符。即使搜索字符串替换为双wid