类似SQL的表达式找不到半空格字符(Zero-Width-Non-Joiner(ZWNJ))

时间:2011-10-31 17:24:56

标签: sql-server unicode internationalization codepages

在下面的代码中,我想选择此令牌包含半空格字符的标记。

  Select *  from
     (select token = 'aaa‏‏sss') as dd
  where token like '%‏‏%'

有利的回应:

    aaa‏‏sss

输出回复:

   null

符号: 这个角色是一个波斯角色,并没有带有可见标记。 但是这个角色在自身的两边分开了字符串。 例如:令牌بهترین半空间是بهترین

3 个答案:

答案 0 :(得分:2)

要知道要使用的具体值,需要知道底层列的数据类型是VARCHAR还是NVARCHAR? 此外,对于前者,您还需要知道此数据库使用的代码页

一般情况下,你必须使用类似

的转义序列

'abc\x008Adef'其中\ x008A将是底层编码系统中半空间的适当代码。
在代码页设置中,该值可能介于0x0080和0x00FF之间,可能类似于Unicode中的0x2000。 事实上,如果你使用unicode字符串,你需要在转义序列中省略'x',并使用类似的东西 N'abc\2000def'(再次,假设hex 2000实际上是你想到的那种半空间。)

另一种可能的出路可能是因为底层数据库中使用的排序规则将这些半空格处理为普通空格,因此您可以使用常规空格字符。查询。 (有点像人们使用基于1252代码页的一些排序规则,其中强调的字符被认为等同于非重音形式。

答案 1 :(得分:2)

我认为问题在于整理。

例如此查询:

select PATINDEX('%‏‏%','aaa‏‏sss' collate  Arabic_CI_AS)

返回1,但是这一个:

select PATINDEX('%‏‏%','aaa‏‏sss' collate  SQL_Latin1_General_CP1_CI_AS)

返回4;这是输入字符串中半空格字符的正确位置。

screenshot

因此,您必须将输入字符串的排序规则更改为某些Latin Collat​​ion,例如: SQL_Latin1_General_CP1_CI_AS

答案 2 :(得分:0)

我找到了这个问题的解决方案。 如果我们在模式字符串之前放置字符'N',则响应将被更正。 字符N表示后面的字符串是Unicode。 更正后的代码:

  Select *  from
     (select token = 'aaa‏‏sss') as dd
  where token like N'%‏‏%'