1

TSQL patindex 中的 CHAR(13) 或 CHAR(14) 有什么问题?一旦我在模式中包含 CHAR(14),我就找不到任何记录。在寻找答案时,我刚刚从 2009 年(这里:http ://www.sqlservercentral.com/Forums/Topic795063-338-1.aspx)找到了我自己的问题(未回答)。

这是另一个简单的测试,以说明我的意思:

/* PATINDEX TEST */
DECLARE @msg NVARCHAR(255)
SET @msg = 'ABC' + NCHAR(13) + NCHAR(9) + 'DEF'

DECLARE @unwanted NVARCHAR(50)
-- unwanted chars in a "chopped up" string
SET @unwanted = N'%[' + NCHAR(1) + '-' + NCHAR(13) + NCHAR(14) + '-' + NCHAR(31) + ']%'
SELECT patindex(@unwanted, @msg)

-- 结果:4

-- NOW LET THE unwanted string includ the whole range from 1 to 31


   SET @unwanted = '%['+NCHAR(1)+'-'+NCHAR(31)+']%' -- -- As soon as Char(14) is included, we get no match with patindex!
    SELECT patindex(@unwanted, @msg)

-- 结果:0

4

1 回答 1

6

这是允许的。

您需要记住,这些范围是基于排序规则排序顺序而不是字符代码,因此可能在您的默认排序规则中,它排序在您不期望的位置。

您的数据库的默认排序规则是什么?

以下返回什么?

;WITH CTE(N) AS
(
SELECT 1 UNION ALL
SELECT 9 UNION ALL
SELECT 13 UNION ALL
SELECT 14 UNION ALL
SELECT 31 
)
SELECT N 
FROM CTE
ORDER BY NCHAR(N)

对我来说它返回

N
-----------
1
14
31
9
13

所以字符 9 和 13 都在 1-31 范围之外。因此

'ABC' + NCHAR(13) + NCHAR(9) + 'DEF' NOT LIKE N'%['+NCHAR(1)+N'-'+NCHAR(31)+N']%'

这解释了您问题中的结果。字符 14 没有进入它。

您可以使用二进制 collat​​e 子句使其按预期排序。例如

SELECT patindex(@unwanted COLLATE Latin1_General_100_BIN, @msg)

4在第二个查询中也返回。

于 2012-01-20T13:55:56.887 回答