Sql server 类SQL表达式找不到半空格字符(零宽度非连接符(ZWNJ))
在下面的代码中,我想选择这个令牌包含半个空格字符的令牌Sql server 类SQL表达式找不到半空格字符(零宽度非连接符(ZWNJ)),sql-server,unicode,internationalization,codepages,Sql Server,Unicode,Internationalization,Codepages,在下面的代码中,我想选择这个令牌包含半个空格字符的令牌 Select * from (select token = 'aaasss') as dd where token like '%%' 正面回应: aaasss null 输出响应: aaasss null 符号: 此字符是波斯字符,未显示可视标记。 但这个字符将字符串的两侧分开。 例如:带半空格的令牌为若要知道要使用的特定值,需要知道基础列的数据类型是什么,是VA
Select * from
(select token = 'aaasss') as dd
where token like '%%'
正面回应:
aaasss
null
输出响应:
aaasss
null
符号:
此字符是波斯字符,未显示可视标记。
但这个字符将字符串的两侧分开。
例如:带半空格的令牌为若要知道要使用的特定值,需要知道基础列的数据类型是什么,是VARCHAR还是NVARCHAR? 此外,对于前者,您还需要进一步了解该数据库使用的代码页 一般来说,您必须使用转义序列,例如 “abc\x008Adef”其中\x008A是底层编码系统中半空间的适当代码。 该值在代码页设置中可能介于0x0080和0x00FF之间,在Unicode中可能类似于0x2000。 事实上,如果您使用unicode字符串,您将需要在转义序列中省略“x”,只需使用 N'abc\2000def',假设hex 2000实际上是您心目中的半空间
另一种可能的解决方法是,底层数据库上使用的排序规则将这半个空格作为普通空格处理,因此您可以在查询中只使用常规空格字符。有点像人们使用基于1252代码页的排序规则,其中重音字符被认为等同于非重音形式。我找到了这个问题的解决方案。 如果我们将字符“N”放在模式字符串之前,响应将被更正。 字符N表示它后面的字符串是Unicode。 更正代码:
Select * from
(select token = 'aaasss') as dd
where token like N'%%'
我认为问题在于校勘 例如,此查询:
select PATINDEX('%%','aaasss' collate Arabic_CI_AS)
返回1,但这一个:
select PATINDEX('%%','aaasss' collate SQL_Latin1_General_CP1_CI_AS)
返回4;这是输入字符串中半空格字符的正确位置
因此,您必须将输入字符串的排序规则更改为一些拉丁排序规则,如:SQL\u Latin1\u General\u CP1\u CI\u AS您的答案是正确的,带有英文字符。但是由波斯语字符组成的字符串是错误的。波斯语的正确排序规则是:波斯语为:Persian_100_BIN或Persian_100_Bin2,阿拉伯语为:阿拉伯语为TehMarbute char。